添加链接描述
上面文章中讲述二叉树的顺序存储结构的代码,这里给运行了一下,以及遇到的一些问题,我都在代码里标注了.
#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]
```这是因为我在输入过程中少输入了"}",导致我在函数内部声明函数
如果在测试代码的时候报了这样的错误,注意是否是有"}问题!