一、实验目的
1、 熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、 掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
二、 实验内容
自己确定一个二叉树(树结点类型、数目和结构自定)利用顺序结构方法存储。实现树的构造,并完成:
1)层序输出结点数据;
2)以合理的格式,输出各个结点和双亲、孩子结点信息;
3)输出所有的叶子结点信息;
4)分析你的算法对于给定的二叉树的存储效率。
三、算法分析
1、定义tree类,长度为100的字符型数组,利用数组存放二叉树的结点信息。
2、print()层序输出不为空的结点,leaf()输出所有叶子结点信息,cp()查询结点双亲和孩子信息。
四、代码
#include<iostream>
using namespace std;
const int MaxSize=100;
class tree
{
private:
char data[MaxSize];
int length;
public:
~tree(){}
tree(char a[],int n);
void print();
void leaf();
void cp(int i);
};
tree::tree(char a[],int n)
{
int last=0;
if(n>=MaxSize) throw"full";
for(int i=0;i<n;i++)
{ data[i]=a[i];
length=n;
}
}
void tree::print()
{
for(int i=0;i<length;i++)
{if(data[i]!='1')
cout<<data[i]<<" ";}
cout<<endl;
}
void tree::cp(int i)
{
if(data[2*i-1]!='1'&&2*i-1<length&&data[i-1]!='1') cout<<"左孩子:"<<data[2*i-1]<<endl;
else cout<<"没有左孩子!"<<endl;
if(data[2*i]!='1'&&2*i<length&&data[i-1]!='1') cout<<"右孩子:"<<data[2*i]<<endl;
else cout<<"没有右孩子!"<<endl;
cout<<"双亲为:"<<data[i/2-1]<<endl;
}
void tree::leaf()
{
for(int i=1;i<=length;i++)
if(data[i-1]!='1'&&data[2*i-1]=='1'&&data[2*i]=='1') cout<<data[i-1]<<" ";
}
void main()
{
char t[13]={'A','B','C','1','D','E','1','1','1','F','1','1','G'};
tree T(t,13);
T.print();
T.leaf();
cout<<"查询第3个"<<endl;
T.cp(3);
}
五、运行结果
六、总结
用顺序存储结构方法存储二叉树和顺序表差不多。
当二叉树为完全二叉树或满二叉树时,存储效率较高;当其为右斜树时,存储效率最低。