二叉树的顺序存储结构

添加链接描述
上面文章中讲述二叉树的顺序存储结构的代码,这里给运行了一下,以及遇到的一些问题,我都在代码里标注了.

#include<iostream>
#include<cstring>
using namespace std;
const int m=100;
class BiTree{
public:
	BiTree();
	~BiTree(){}
	int create_BT();//手动输入二叉树各节点的信息
	void leverOrder();//层序输出
	void print();//输出所有结点以及信息
	void printleaf();//输出叶子结点的信息
	int Tree[m];
	int count;//实际记录结点个数
	int num;
};
BiTree::BiTree()//初始化,建立一个空树
{
  for(int i=0;i<m;i++){//这里的m前面定义过,值是100
	Tree[i]=-1;
count=0;//这是表示结点的个数
}
}
int BiTree::create_BT(){//建立一棵树
	int n,i=1;
	num=0;
	count=0;
	cout<<"请按照从上到下,从左到右的顺序一次输入二叉树的各个结点,结节点用0表示,以-1表示输入结束";
//相比与原博客  这里有必要说明一下:按照满二叉树结构,存在的结点输入序号,不存在的结点输入0,最后输入-1,代表结束.	
    while(cin>>n&&n!=-1&&i<m){
		Tree[i]=n;
	i++;
		num++;//这个num++好像不起啥作用
			if(n==0) continue;
				else count++;
}
return 0;
}
void BiTree::leverOrder()//层序遍历操作  就是一层一层的遍历,先遍历第一层 接着第二层这样顺序
{
for( int i=1;Tree[i]!=-1&&i<100;i++)
	cout<<Tree[i]<<" ";//这里是输出你刚刚输入的结点 
	cout<<"二叉树层序遍历: ";
for(int i=1;Tree[i]!=-1&&i<m;i++){//这里与原博客有点出入,原博客提示了[Error] name lookup of 'i' changed for ISO 'for' scoping
//原文是:for(i=1;....),提示i的作用域范围的错,于是这里我给改了一下 
if(Tree[i]==0) continue;//遇到为空的结点,就跳到下一次循环,在下面的输出中我们将会看到,所有的0都没有输出
cout<<Tree[i]<<" ";//遍历输出那些非0的结点
}
}
void BiTree::print()//输出所有结点操作
{
for(int i=1;Tree[i]!=-1&&i<m;i++){
static int j=0;
if(Tree[i]==0) continue;
else j++;
//这里说明一下 :如果该节点是0结点  ,那么直接跳过,进入下一次循环
cout<<"第"<<j<<"个结点的信息为"<<Tree[i]<<" ";
//根据完全二叉树的性质我们可以知道如果2*i>count,也就是大于总的结点数,那么这个结点没有左孩子,否则这个结点的左孩子序号是2i
//这个程序中,如果2*i位置是0,也代表着它没有左孩子  前面叙述可知,序号为0的点是空结点
if(Tree[2*i]==0||Tree[2*i]==-1)cout<<"该结点无左孩子"<<" ";
else cout<<"左孩子为"<<Tree[2*i]<<" ";

//根据完全二叉树的性质,我们可以知道,如果i=1,结点是根结点,他没有双亲,否则它的双亲结点是[i/2],取不大于这个值的最大整数
//与上面一样,若i/2所代表的结点为0,那么是空节点.
if(int(i/2)==0) cout<<"该结点为根结点,无双亲"<<endl;
else if (Tree[int(i/2)==0])cout<<"该结点的双亲为: "<<Tree[int(i/2)+1]<<endl;else cout<<"该结点的双亲为"<<Tree[int(i/2)]<<endl;
}
}
void BiTree::printleaf(){
cout<<"所有的叶子信息为 ";
for(int i=1;i<num+1;i++){
//所谓的叶子结点,它没有左孩子,也没有右孩子,这条语句执行的就是这个功能
if((Tree[2*i]==0||Tree[2*i]==-1)&&(Tree[2*i+1]==0||Tree[2*i+1]==-1))
	//在上面的基础上,还要判断这个结点是否存在,如果该结点是0,按照前面叙述的,那么也是一个空节点
	if(Tree[i]!=0&&Tree[i]!=-1)
	cout<<Tree[i]<<" ";
}
}
int  main(){
BiTree b;
b.create_BT();
cout<<"输入的树为: ";
try{
b.leverOrder();
cout<<endl;}
catch(char *s){
cout<<s<<endl;
}
cout<<"共有"<<b.count<<"个有效结点"<<endl;
b.print();
b.printleaf();
return 0;
}

接下来看一下运行的结果:`请按照从上到下,从左到右的顺序一次输入二叉树的各个结点,结节点用0表示,以-1表示输入结束1 2 3 0 4 5 0 0 0 6 7 0 8 -1
输入的树为: 1 2 3 0 4 5 0 0 0 6 7 0 8 二叉树层序遍历: 1 2 3 4 5 6 7 8
共有8个有效结点
第1个结点的信息为1 左孩子为2 该结点为根结点,无双亲
第2个结点的信息为2 该结点无左孩子 该结点的双亲为: 2
第3个结点的信息为3 左孩子为5 该结点的双亲为: 2
第4个结点的信息为4 左孩子为6 该结点的双亲为: 3
第5个结点的信息为5 该结点无左孩子 该结点的双亲为: 0
第6个结点的信息为6 该结点无左孩子 该结点的双亲为: 5
第7个结点的信息为7 该结点无左孩子 该结点的双亲为: 5
第8个结点的信息为8 该结点无左孩子 该结点的双亲为: 0
所有的叶子信息为 6 7 8 ``
这里实现的这样的图:
在这里插入图片描述
还有在测试过程中 ,由于我手动敲了代码 出现了这样的一个错误:

 error: name lookup of ‘i’ changed for ISO ‘for’ scoping [-fpermissive]

```这是因为我在输入过程中少输入了"}",导致我在函数内部声明函数
如果在测试代码的时候报了这样的错误,注意是否是有"}问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值