#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