二叉树的顺序存储结构
#include<iostream>
#include<cstdio>
using namespace std;
#define Virnode '0'//定义虚拟节点
#define MAX_TREE_SIZE 100//定义存储空间最大量
typedef char Elemtype;//定义节点类型
typedef Elemtype SqBitTree[MAX_TREE_SIZE];//SqbitTree[0]单元存放节点的总数,通常存放构成满二叉树的节点总数
void leveltree(SqBitTree bt)//按满二叉树遍历
{
int i=1;
while(i<=bt[0])
{
for(int j=i;j<2*i;j++){//按层扫描
if(bt[j]==Virnode) cout<<"*";
else cout<<bt[j];
}
cout<<endl;
i*=2;//跳到下一层的节点
}
}
void crebitree (SqBitTree bt,int n)//n为真实节点
{
int m=0;
int i=1;
while(m<n)
{
for(int j=i;j<2*i;j++){//按层次输入,虚拟节点值一起输入
scanf("%c",bt+j);
if(bt[j]!=Virnode) m++;
}
i*=2;
}
bt[0]=i-1;//存放满二叉树的节点总数
}
void exchange(SqBitTree bt)
{
int k=2;
while(k<=bt[0])
{
for(int i=k,j=2*k-1;i<j;i++,j--)
{Elemtype t=bt[i];bt[i]=bt[j];bt[j]=t;}
k*=2;
}
}
int coutleaf(SqBitTree bt)
{
int i=1;
int cnt=0;
while(i<=bt[0]/2)//按性质可知,凡是大于bt[0]/2的节点均为叶子节点
{
for(int j=i;j<2*i;j++)
if(bt[j]!=Virnode&&bt[2*j]==Virnode&&bt[2*j+1]==Virnode)
cnt++;
i*=2;
}
for(int j=i;j<2*i;j++)//最底层不是虚拟节点,就是叶子节点
if(bt[j]!=Virnode) cnt++;
return cnt;
}
int high(SqBitTree bt)
{
int h=0;
int i=1;
while(i<=bt[0])
{
h++;
i*=2;
}
return h;
}
int count2(SqBitTree bt)
{
int i=1;
int cnt=0;
while(i<=bt[0]/2)//由性质可知,大于bt[0]/2的节点不可能是度为2的节点
{
for(int j=i;j<i*2;j++)
if(bt[j]!=Virnode&&bt[j*2]!=Virnode&&bt[j*2+1]!=Virnode)
cnt++;
i*=2;
}
return cnt;
}
int count1(SqBitTree bt)
{
int i=1;
int cnt=0;
while(i<=bt[0]/2)//由性质可知,大于bt[0]/2的节点不可能是度为1的节点
{
for(int j=i;j<2*i;j++)
if(bt[j]!=Virnode&&((bt[j*2]==Virnode&&bt[j*2+1]!=Virnode)||(bt[j*2+1]==Virnode&&bt[j*2]!=Virnode)))
cnt++;
i*=2;
}
return cnt;
}
void search(SqBitTree bt,Elemtype x,Elemtype *pa,Elemtype *lc,Elemtype *rc)
{
int i=1;
while(i<=bt[0]&&bt[i]!=x) i++;
if(i>bt[0]){cout<<"Not found"<<endl;*pa=*lc=*rc=Virnode;return ;}
if(i==1) {cout<<"This node has not parents"<<endl;*pa=Virnode;}
else *pa=bt[i/2];
if(i>bt[0]/2||bt[i*2]==Virnode) {cout<<"This node has not left child"<<endl;*lc=Virnode;}
else *lc=bt[i*2];
if(i>bt[0]/2||bt[i*2+1]==Virnode) {cout<<"This node has not right child"<<endl; *rc=Virnode;}
else *rc=bt[i*2+1];
}
int main()
{
SqBitTree bt;
int n;
int leaf;
int h;
Elemtype x,*pa,*lc,*rc;
pa=(Elemtype *)malloc(sizeof(Elemtype));
lc=(Elemtype *)malloc(sizeof(Elemtype));
rc=(Elemtype *)malloc(sizeof(Elemtype));
cin>>n;
getchar();
memset(bt,0,sizeof(bt));
crebitree(bt,n);
leveltree(bt);
exchange(bt);
leveltree(bt);
leaf=coutleaf(bt);
cout<<leaf<<endl;
h=high(bt);
cout<<h<<endl;
cout<<count2(bt)<<endl;
cout<<count1(bt)<<endl;
cin>>x;
search(bt,x,pa,lc,rc);
cout<<*pa<<" "<<*lc<<" "<<*rc<<endl;
return 0;
}