二叉树的顺序存储和三种遍历(二)
2012-06-09 17:42
323 查看
//二叉树的顺序存储,三种遍历的代码
# 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;
}
}
}
心得:不管是顺序存储还是链式存储,首先,考虑,结点的数据类型(有时还要考虑结点的结点的数据类型),表头的数据类型;初始化表头;数据怎么样输入到内存中;数据怎么从内存中输出来;这样分块的想问题,会让我们心里有底,即使遇到困难了,也不会慌。
# 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;
}
}
}
心得:不管是顺序存储还是链式存储,首先,考虑,结点的数据类型(有时还要考虑结点的结点的数据类型),表头的数据类型;初始化表头;数据怎么样输入到内存中;数据怎么从内存中输出来;这样分块的想问题,会让我们心里有底,即使遇到困难了,也不会慌。
相关文章推荐
- 二叉树用数组顺序存储(完全二叉树)并实现三种遍历,代码详解!!!
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- python3 二叉树的存储和三种遍历
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的顺序存储实现及遍历
- 二叉树三种顺序遍历应用
- 二叉树三种遍历方法(根据两种排序求第三种的顺序)
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树顺序存储和遍历
- 二叉树数组顺序存储与遍历
- 二叉树的链式存储和三种遍历(一)
- 二叉树三种顺序遍历板子
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 数据结构把顺序存储的二叉树转换成链式存储及前序,中序,后序遍历
- 数据结构与算法简记:按层次顺序遍历和存储二叉树
- 二叉树三种遍历方式的递归和循环实现
- 43 递归和非递归俩种方法实现二叉树的三种遍历
- 二叉树的三种非递归遍历方式。
- 种一棵顺序存储的二叉树