//二叉树的顺序存储,三种遍历的代码
# include <stdlib.h>
# include <iostream.h>

# define chuzhi 50 //初始一维数组的大小
# define zengzhi 50 //一维数组的增量

typedef struct //定义树的头结点的数据类型
{
char *sz;//存放一维数组的头地址
int i;//存放一维数组的下标
int max;//存放一维数组的大小
}shu;

//初始化顺序表的头结点
void chushihua(shu &s)
{//分配相应空间,并给相应元素赋初值
int i;
s.sz=(char *)malloc(chuzhi * sizeof(char));//开辟存放元素的空间
s.i=0;//初始的下标为0
s.max=chuzhi;
for(i=0;i<chuzhi;i++)//给一维数组赋初值,是为了真确的输出树的结点元素
*(s.sz+i)='$';
cout<<"表头的初始化完成!\n";
}

//向一维数组中输入树的信息
void shuru(shu &s)
{
int j;//j的值代表着一维数据的下标和结点在树中的序号(按层次排)
char ch;
j=0;
while(j!=-1)
{
//输入结点在树中的序号或退出
cout<<"请按结点在树中的序号的大小顺序输入(退出请输入-1):";
cin>>j;

if(j!=-1)//输入结点字符
{
cout<<"请输入结点字符:";
cin>>ch;
}

while(j>s.max)//如果一维数组不够大的操作
{
int n;
s.sz=(char *)realloc(s.sz,zengzhi+s.max);
for(n=s.max;n<s.max+zengzhi;n++)//初始化新开辟的空间
*(s.sz+n)='$';
s.max=zengzhi+s.max;
}

if(j!=-1)//存放元素值
{
s.i=j;//s.i中存放的是用到的一维数组下标的最大值
*(s.sz+j)=ch;//向一维数组中存放,把结点在树中的序号和一维数组的序号相对应
}
}
cout<<"你的输入以完成!\n";
}

//先序遍历的实现,后面的几种遍历的思想一样,后面的就不做过多解释
void shuchu1(shu &s,int i)
{
if(s.i==0)//判断是否为
{
cout<<"次树为空树!\n";
return;
}
if(*(s.sz+i)!='$')//当用到一维下标是17但没用一维下标为16时,就不输出一维下标为16存放的值
cout<<*(s.sz+i);
if(2*i<=s.i)//二叉树的性质
shuchu1(s,2*i);//迭代的思想
if((2*i+1)<=s.i)//二叉树的性质
shuchu1(s,2*i+1);//迭代的思想
}

//后序遍历的实现
void shuchu2(shu &s,int i)
{
if(s.i==0)//判断是否为空
{
cout<<"次树为空树!\n";
return;
}

if(2*i<=s.i)
shuchu2(s,2*i);
if((2*i+1)<=s.i)
shuchu2(s,2*i+1);
if(*(s.sz+i)!='$')
cout<<*(s.sz+i);
}

//中序遍历的实现
void shuchu3(shu &s,int i)
{
if(s.i==0)//判断是否为
{
cout<<"次树为空树!\n";
return;
}

if(2*i<=s.i)
shuchu3(s,2*i);
if(*(s.sz+i)!='$')
cout<<*(s.sz+i);
if((2*i+1)<=s.i)
shuchu3(s,2*i+1);
}

//主函数

void main()
{
int option1;//用户菜单的选择
int option2;//用户子菜单的选择
shu s;//定义表头

chushihua(s);//初始化表头
option1=0;
while(option1!=3)
{
cout<<"\n\n\n\n 菜单\n\n";
cout<<" 1、输入树的信息\n";
cout<<" 2、遍历树并显示\n";
cout<<" 3、退出\n\n";
cout<<"请输入您的操作:";
cin>>option1;

switch(option1)
{
case 1:
shuru(s);
break;
case 2:
cout<<" 1、先序遍历\n";
cout<<" 2、后序遍历\n";
cout<<" 3、中序遍历\n\n";
cout<<"请选择遍历的方式:";
cin>>option2;
switch(option2)
{
case 1:
shuchu1(s,1);
break;
case 2:
shuchu2(s,1);
break;
case 3:
shuchu3(s,1);
break;
default:
break;
}

break;

default:

break;

}
}

}

心得:不管是顺序存储还是链式存储,首先,考虑,结点的数据类型(有时还要考虑结点的结点的数据类型),表头的数据类型;初始化表头;数据怎么样输入到内存中;数据怎么从内存中输出来;这样分块的想问题,会让我们心里有底,即使遇到困难了,也不会慌。

二叉树的顺序存储和三种遍历(代码)相关推荐

  1. 二叉树的建立和三种遍历

    二叉树的三种遍历是以根的遍历顺序来讲的 先序遍历(根左右) 中序遍历(左根右) 后序遍历(左右根) 二叉树是从根节点的那一层开始,从左至右读每一层的结点读入的.@表示空结点,#表示输入结束 #incl ...

  2. 二叉树的创建与三种遍历方式(带图文详解)

    二叉树是由多节点组成的,每个节点最多链接两个节点,这两个节点就称为根节点的左树和右树. 每个节点的由数据区,左树,右树组成. typedef struct node {int data;struct ...

  3. 二叉树的建立与三种遍历

    树是一种数据结构,为什么叫它"树",因为它倒过来就是一棵树 根在上,而叶在下 其概念主要有根.父.子.深.叶等, 如上图:A为这棵树的根 B为D的父,而D则为B的子 E.F.G互为 ...

  4. 20-12-22 二叉树的构建、三种遍历、顺序二叉树原理

    二叉树: public class BinaryTree {public static void main(String[] args) {HeroNode heroNode1 = new HeroN ...

  5. C语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)

    关于二叉树的定义,网上有比较好的介绍,在这里就简单介绍二叉树的一些性质 二叉树的基本性质 1)二叉树的第i层上至多有 2^(i-1)(i ≥1)个结点: 2)深度为 h 的二叉树中至多含有 2^h – ...

  6. c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理

    二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个名字?是根据根节点的顺序命名的. 比如上图正常的一个满节点,A:根节点.B:左节点.C:右节点,前序顺序是ABC(根节点排最先,然后 ...

  7. 二叉树的三种遍历(递归与非递归) + 层次遍历

    <转载于  >>> > 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此 ...

  8. 二叉树----数据结构:二叉树的三种遍历及习题

    二叉树----数据结构:二叉树的三种遍历,利用递归算法. 关于二叉树的遍历,应用非常广泛,不单单是访问打印结点,还可以进行一系列的操作,如赋值.删除.查找.求二叉树的深度等等. 有递归和非递归两种算法 ...

  9. 一文弄懂二叉树三种遍历

    作者 | 菠了个菜 责编 | 屠敏 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次. 在二叉树的遍历中存在三种较为常用的遍历方式:前序遍历.中 ...

  10. 【数据结构】理解二叉树的三种遍历--前序、中序、后序 +层序(简明易懂)

    一.易懂的形象理解 其实从名字就可以很好的理解这三种遍历,我在第二点时候说,但是估计能翻到我的文的同学们之前肯定看过好多类似的了,那咱们换个思路~ 先用我想的一种简单易懂的形象思维理解一下前序.中序. ...

最新文章

  1. 生成html页面的ftl文件,FreeMarker生成静态HTML页面的工具类FreeMarkerUtil
  2. 对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)
  3. 1.1.3 以Self Host方式寄宿Web API
  4. WF4.0:NativeActivity中的错误处理
  5. android 已经给权限读取照片 还是提示无法读取照片_iPhone无法访问照片,一招教你解决...
  6. 听说,那谁谁谁是同性恋?
  7. HTML文档包应含几个基本标记,HTML基本结与常用标记.doc
  8. 各种数字显示屏接口:LVDS, DVI, HDMI, DisplayPort, DSI
  9. 构建自己的PHP框架--实现Model类(2)
  10. postman发送json格式的post请求
  11. 台电tbook10s官方固件_台电Tbook10S线刷包_台电Tbook10S刷机包_台电Tbook10S固件包_台电Tbook10S救砖包 - 线刷宝ROM中心...
  12. svn往分支提代码_SVN建立分支和合并代码
  13. 在线购物系统-面对对象设计
  14. 基于python实现开机自动连接校园网(广工商)
  15. vue父组件与子组件之间传值
  16. PDE优化|逆问题中偏微分方程约束优化的惩罚方法(Matlab代码实现)
  17. Altium Designer——PCB中更改线宽的技巧总结
  18. php如何获得系统时间,php如何获取系统时间
  19. 对高考选志愿的一点看法
  20. C语言期末考试内容(1)主观题

热门文章

  1. 网站优化之robots文件详解
  2. photoshop抠图与相框的制作
  3. 迅雷下载VS2015地址,快、狠,准
  4. 聚沙成塔的分布式云存储
  5. python随机生成三位数字_python3 随机生成数字
  6. CF 1467 C. Three Bags
  7. linux ntfs格式u盘实现与挂载
  8. 博弈论(Game Theory)入门——完全信息静态博弈
  9. Effect Size
  10. canvas绘制竖排的数字_微信小程序利用Canvas绘制图片和竖排文字详解