实验 5:树和二叉树的实验 1

#include<iostream>

using namespace std;

const int Max=20;              //树最大规模为20

class Tree

{

char data[Max];                //用数组存放数据

int length;                    //记录树大小

public:

Tree(char a[],int n);          //有参构造函数实现数据存储

~Tree(){}

void Cengxu();                 //层序输出

void Pring();                  //输出结点的双亲、孩子信息

void Leaf();                   //输出叶子信息

};

 

Tree::Tree(char a[],int n)

{

if(n>Max||n<1) throw"错误";     //排除溢出问题

for(int i=0;i<n;i++)            //实现数据的存储

data[i]=a[i];

length=n;

}

void Tree::Cengxu()             //层序遍历

{

for(int i=0;i<length;i++)

{

if(data[i]!='#')          //为"#"(虚结点)时,表示无数据

cout<<data[i];            //结点不为虚结点标识时依次输出数据

}

}

void Tree::Pring()             //输出结点的双亲和孩子结点信息

{

int c1,c2,b;

for(int i=1;i<=length;i++)

{

c1=2*i;                 //左孩子

c2=2*i+1;               //右孩子

b=i/2;                  //双亲

if(data[i-1]!='#')      //排除空结点,且规定"#"为空结点

{

if(b>=1)            //排除结点i无双亲

cout<<"结点"<<i<<"\t双亲为:"<<data[b-1]<<"  ";

else

cout<<"结点"<<i<<"\t无双亲"<<"  ";

if(data[c1-1]!='#' && c1<=length)       //最后一层叶子结点是无孩子的

cout<<"\t左孩子为:"<<data[c1-1]<<"  ";

else

cout<<"\t无左孩子"<<"  ";

if(data[c2-1]!='#' && c2<=length)

cout<<"\t右孩子为:"<<data[c2-1]<<"  ";

else

cout<<"\t无右孩子";

cout<<endl;

}

}

}

void Tree::Leaf()          //输出叶子信息

{

int c1,c2;

for(int i=1;i<=length;i++)

{

c1=2*i;

c2=2*i+1;

if(data[c1-1]=='#' && data[c2-1]=='#' && data[i-1]!='#')

cout<<data[i-1];

if(c1>length && data[i-1]!='#')

cout<<data[i-1];

}

}

 

void main()

{

char b[10]={'1','2','#','3','4','5','6','#','7','8'};

Tree c(b,10);

cout<<"该二叉树的层序输出为:";

c.Cengxu();

cout<<endl;

c.Pring();

cout<<endl;

cout<<"叶子结点信息为:";

c.Leaf();

cout<<endl;

}

该二叉树共开辟了10个指针,即空间,但有效数据只有8个,也就是说该二叉树的有效利用空间为8

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值