实验5:二叉树的顺序存储实验

来源:互联网 发布:为什么淘宝卖家不回话 编辑:程序博客网 时间:2024/05/17 04:28
 一、实验目的
1、   熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、   掌握树的顺序结构的实现;
3、   学会运用树的知识解决实际问题
二、 实验内容
自己确定一个二叉树(树结点类型、数目和结构自定)利用顺序结构方法存储。实现树的构造,并完成:
1)层序输出结点数据;
2)以合理的格式,输出各个结点和双亲、孩子结点信息;
3)输出所有的叶子结点信息;
4)分析你的算法对于给定的二叉树的存储效率。


源代码如下:
#include<iostream>#include<math.h>using namespace std;const int max=100;template <class T>class SeqTree{public:SeqTree();void CreateTree();void LeverOrder();void Message(int d);void Leaves();private:T bt[max];int number,order;};template <class T>SeqTree<T>::SeqTree(){number=0;order=0;for(int i=0;i<max;i++)  bt[i]='0';}template <class T>void SeqTree<T>::CreateTree(){cout<<"请输入树的各个结点数据(结点输入#为空,输入e结束):";T n='#';while(n!='e'){cin>>n;if(n!='e'){if(n!='#') number++; bt[order++]=n;}}}template <class T>void SeqTree<T>::LeverOrder(){if(number==0) throw"空树";for(int i=0;i<order;i++){if(bt[i]!='#')  cout<<bt[i]<<" ";}cout<<endl<<endl;}template <class T>void SeqTree<T>::Message(int d){if(d<0||d>order)   throw"溢出";else{if(bt[d]!='#'){cout<<"该结点的数据为:"<<bt[d]<<endl;if(d!=0)  cout<<"该结点的双亲为:"<<bt[(d-1)/2]<<endl;else cout<<"该结点为根,无双亲"<<endl;cout<<"左孩子:"<<bt[d*2+1]<<"\t右孩子:"<<bt[(d+1)*2]<<endl<<endl;}else cout<<"该结点为空!"<<endl<<endl;}}template <class T>void SeqTree<T>::Leaves(){if(number==0) throw"空树";cout<<"叶子结点为:";for(int i=0;i<=order;i++){if(bt[i]!='0')  {if(bt[i*2+1]=='0' && bt[(i+1)*2]=='0')   cout<<bt[i]<<" ";}}cout<<endl<<endl;}int main(){int f=1,a,i; SeqTree<char> s;    cout<<"\t   二叉树的顺序存储"<<endl;cout<<"\t*******   1.建立二叉树   *****"<<endl;cout<<"\t*******   2.层序输出   *******"<<endl;cout<<"\t*******   3.结点信息   *******"<<endl;cout<<"\t*******   4.叶子结点   *******"<<endl;cout<<endl<<endl;while(f){cout<<"\t请选择[1-5]:";cin>>a;cout<<endl;switch(a){case 1: {s.CreateTree();cout<<endl;break;}case 2:{s.LeverOrder();break;}case 3:{cout<<"请输入您要查询的结点:";cin>>i;s.Message(i-1);break;}case 4:{s.Leaves();break;}case 5:{  f=0;cout<<"欢迎再次使用!"<<endl;break;}default:{cout<<"不存在该命令!"<<endl;    break;}}}return 0;}
运行结果如下: