实验4 :树和二叉树的实验 1
一、实验目的
1、熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
二、实验内容 自己确定一个二叉树(树结点类型、数目和结构自定)利用顺序结构方法存储。实 现树的构造,并完成:
1、层序输出结点数据;
2、以合理的格式,输出各个结点和双亲、孩子结点信息;
3、输出所有的叶子结点信息;
4、分析你的算法对于给定的二叉树的存储效率。
三、实验步骤
1、依据实验内容,先确定具体的二叉树,并说明结点的数据据类型;
2、设计具体的算法;
3、写出完整程序;
4、总结、运行结果和分析算法效率。
5、总体收获和不足,疑问等。
四、实验要求
1、 按照数据结构实验任务书,提前做好实验预习与准备工作。
2、 在个人主页上发文章提交作业。
#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 Getcount(){return count;}
private:
int Tree[M]; //存放结点的数组
int num; //记录实际输入的结点个数
int count; //记录实际结点个数
};
BiTree::BiTree() //构造函数建立一个空数
{
for(int i=1;i<M;i++)
Tree[i]=-1;
count=0;
num=0;
}
int BiTree::Create_BT() //创建一棵二叉树
{
int n;
cout<<"请按照从上到下、从左到右的顺序依次输入二叉树各个结点,空结点用0表示,以-1表示输入结束:"<<endl;
for(int i=1;cin>>n&&n!=-1&&i<M;i++)
{
Tree[i]=n;
num++;
if(n==0) continue;
else count++;
}
return 0;
}
void BiTree::Print() //输出所有结点的双亲和孩子操作
{
for(int i=1;Tree[i]!=-1&&i<num+1;i++)
{
static int j=0; //静态局部变量
if(Tree[i]==0) continue;
else j++;
cout<<"第"<<j<<"个结点信息为"<<Tree[i]<<" ";
if(Tree[2*i]==0||Tree[2*i]==-1)
cout<<"该结点无左孩子"<<" ";
else
cout<<"左孩子为 "<<Tree[2*i]<<" ";
if(Tree[2*i+1]==0||Tree[2*i+1]==-1)
cout<<"该结点无右孩子"<<" ";
else
cout<<"右孩子为 "<<Tree[2*i+1]<<" ";
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::LeverOrder() //层序遍历操作
{
if(Tree[1]==-1) throw"该树为空树";
for(int i=1;Tree[i]!=-1&&i<100;i++)
cout<<Tree[i]<<" ";
cout<<endl;
cout<<"二叉树的层序遍历:";
for(i=1;Tree[i]!=-1&&i<M;i++)
{
if(Tree[i]==0) continue;
cout<<Tree[i]<<" ";
}
cout<<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))
if(Tree[i]!=0&&Tree[i]!=-1)
cout<<Tree[i]<<" ";
}
}
void main()
{
BiTree b;
b.Create_BT();
cout<<"输入的树为";
b.LeverOrder();
b.Print();
cout<<"共有"<<b.Getcount()<<"个有效结点"<<endl;
b.Printleaf();
}