一、实验目的
1、 熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、 掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
二、 实验内容
自己确定一个二叉树(树结点类型、数目和结构自定)利用顺序结构方法存储。实现树的构造,并完成:
1)层序输出结点数据;
2)以合理的格式,输出各个结点和双亲、孩子结点信息;
3)输出所有的叶子结点信息;
4)分析你的算法对于给定的二叉树的存储效率。
三、算法实现
#include
#include
using namespace std;
const int SIZE=31;
class SeqBinaryTree{
private:
string b[SIZE]; //存放二叉树结点信息
int lastNumber; //存放二叉树最大编号
void printInfor(int bt); //打印结点与其双亲孩子信息
public:
SeqBinaryTree();
void order();
void leverOrder();
void leaf();
};
SeqBinaryTree::SeqBinaryTree(){ //构造函数,创建二叉树
lastNumber=0;
cout<<"创建二叉树,结点信息为空输入#\n(输入0结束)\n";
string inf;
int i=0;
while(cin>>inf){
if(lastNumber>SIZE){
cout<<"上溢!\n";
return;
}
if(inf!="0"){
if(i==0||b[(i+1)/2-1]!="#"){ //根结点或结点双亲不为空
b[i]=inf;
i++;
lastNumber++;
if(b[0]=="#") break;
}else if(inf!="#" && b[(i+1)/2-1]=="#"){ //结点信息不为空,而其双亲为空-->错误
cout<<"\n输入错误(结点信息不为空,而其双亲为空),\n请从编号为"<
<<"的结点开始重新输入:\n";
//cin.ignore(31,'\n');
cin.sync(); //清空输入缓冲区
}
}else break;
}
}
void SeqBinaryTree::printInfor(int bt){ //打印结点与其双亲孩子信息
if(bt>SIZE) return;
cout<<"\n结点"<
<<"的数据信息为:"<
<
1){ cout<<"\t其双亲信息为:"<
lastNumber && (i*2+3)>lastNumber)){ cout<
<<" "; } } } cout<
四、运行结果
![](https://img-blog.csdn.net/20171101160107475)
![](https://img-blog.csdn.net/20171101160214187)
![](https://img-blog.csdn.net/20171101160227326)
![](https://img-blog.csdn.net/20171101160239683)
五、二叉树的顺序存储结构会造成存储空间的浪费,最坏的情况是右斜树,该结构一般仅适合于存储完全二叉树。