二叉樹順序結構儲存
實現如下二叉樹:
程式碼:
[cpp] view plain copy
#include<iostream>
#include<cstring>
using namespace std;
const int maxsize=100;
class bitree
{
public:
bitree();
~bitree(){}
int create_bt();
void leverorder();
void print();
void printleaf();
int tree[maxsize];
int count;
int num;
};
bitree::bitree()
{
for(int i=0;i<maxsize;i++)
tree[i]=-1;
count=0;
}
int bitree::create_bt()
{
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 bitree::leverorder()
{
if(tree[1]==-1) throw"該樹為空樹";
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 bitree::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 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<<"輸入的樹為";
try
{
b.leverorder();
cout<<endl;
}
catch(char *s)
{
cout<<s<<endl;
}
cout<<"共有"<<b.count<<"個有效結點"<<endl;
b.print();
b.printleaf();
}