
顺序存储上面二叉树
#include<iostream.h>
const int Maxsize=50;
class Tree
{
public:
Tree();
~Tree(){}
int Create();
void LeverOrder();
void Print();
void Printleaf();
int tree[Maxsize];
int count;
int num;
};
Tree::Tree()
{
for(int i=0;i<Maxsize;i++)
tree[i]=-1;
count=0;
}
int Tree::Create()
{
int n,i=1;
num=0;
count=0;
cout<<"请按照从上到下、从左到右的顺序依次输入二叉树各个结点,空节点用0表示,以-1表示输入结束:"<<endl;
while(cin>>n&&n!=-1&&i<Maxsize)
{
tree[i]=n;
i++;
num++;
if(n==0) continue;
else count++;
}
return 0;
}
void Tree::LeverOrder()
{
if(tree[1]==-1)throw"NULL";
for(int i=1;tree[i]!=-1&&i<100;i++)
cout<<tree[i]<<" ";
cout<<"层序遍历:";
for(i=1;tree[i]!=-1&&i<Maxsize;i++)
{
if(tree[i]==0)continue;
cout<<tree[i]<<" ";
}
}
void Tree::Print()
{
for(int i=1;tree[i]!=-1&&i<Maxsize;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 Tree::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()
{
Tree b;
b.Create();
cout<<"";
try
{
b.LeverOrder();
cout<<endl;
}
catch(char *s)
{
cout<<s<<endl;
}
cout<<"共有"<<b.count<<"个有效结点"<<endl;
b.Print();
b.Printleaf();
cout<<endl;
}
