数据结构实验四

实验:树和二叉树的实验 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();  

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值