#include<iostream>
using namespace std;
const int MaxSize=100; //树最大规模为100
class Tree
{
private:
char data[MaxSize]; //用数组存放数据
int length; //记录树大小
public:
Tree(char a[],int n); //有参构造函数实现数据存储
~Tree(){}
void Leveroder();//层序输出
void Parch();//输出结点的双亲、孩子信息
void Leaf();//输出叶子信息
};
Tree::Tree(char a[],int n)
{
if(n>MaxSize||n<1) throw"错误"; //排除溢出问题
for(int i=0;i<n;i++) //实现数据的存储
data[i]=a[i];
length=n;
}
void Tree::Leveroder() //层序遍历函数实现
{
for(int i=0;i<length;i++)
{
if(data[i]!='#') //为"#"(虚结点)时,表示无数据
cout<<data[i]; //结点不为虚结点标识时依次输出数据
}
}
void Tree::Parch() //输出结点的双亲和孩子结点信息
{
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[9]={'A','B','C','D','#','E','F','#','G'};
Tree c(b,9);
cout<<"该二叉树的层序输出为:";
c.Leveroder();
cout<<endl;
c.Parch();
cout<<endl;
cout<<"叶子结点信息为:";
c.Leaf();
cout<<endl;
using namespace std;
const int MaxSize=100; //树最大规模为100
class Tree
{
private:
char data[MaxSize]; //用数组存放数据
int length; //记录树大小
public:
Tree(char a[],int n); //有参构造函数实现数据存储
~Tree(){}
void Leveroder();//层序输出
void Parch();//输出结点的双亲、孩子信息
void Leaf();//输出叶子信息
};
Tree::Tree(char a[],int n)
{
if(n>MaxSize||n<1) throw"错误"; //排除溢出问题
for(int i=0;i<n;i++) //实现数据的存储
data[i]=a[i];
length=n;
}
void Tree::Leveroder() //层序遍历函数实现
{
for(int i=0;i<length;i++)
{
if(data[i]!='#') //为"#"(虚结点)时,表示无数据
cout<<data[i]; //结点不为虚结点标识时依次输出数据
}
}
void Tree::Parch() //输出结点的双亲和孩子结点信息
{
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[9]={'A','B','C','D','#','E','F','#','G'};
Tree c(b,9);
cout<<"该二叉树的层序输出为:";
c.Leveroder();
cout<<endl;
c.Parch();
cout<<endl;
cout<<"叶子结点信息为:";
c.Leaf();
cout<<endl;
}