零、说明
- 顺序存储结构最好用于完全二叉树(普通树也可以,把空节点数据设为^即可),链式存储结构任何二叉树都可以
- 性质:
①第i层最多有2i-1个节点,前i层最多有2i-1个节点
②零度顶点=二度顶点+1
③n个顶点的完全二叉树深度为[log2n]+1
④对一棵完全二叉树编号为i的节点,
(i)若i=1,则无双亲,否则双亲是[i/2]
(ii)
i<=(n-1)/2 有左有右
(n-1)/2<i<=n/2 有左无右
i>n/2 无左无右
一、数据类型
typedef char BTree[MAXSIZE];
注意:如果节点数据是’#’,设为空节点
二、建立
按层序遍历输入,$结束
void Create(BTree T)
{
char data;
int i;
for(i=0;i<MAXSIZE;i++)//提前置为零
{
T[i]='#';
}
i=0;//别忘了
cin>>data;
while(data!='$')
{
T[i]=data;
i++;
cin>>data;
}
}
三、遍历
- 先序
void Preorder(BTree T)
{
if(T[0]!='#')//如果树不为空
{
Preorder_Use(T,0);//也可以不用多一层,但是Preorder就要多一个参数了
}
cout<<endl;
}
void Preorder_Use(BTree T,int i)//Preorder调用的,不是在主函数中用的
{
cout<<T[i];
if(T[2*i+1]!='#')
{
Preorder_Use(T,2*i+1);
}
if(T[2*i+2]!='#')
{
Preorder_Use(T,2*i+2);
}
}
- 中序
void Inorder(BTree T)
{
if(T[0]!='#')
{
Inorder_Use(T,0);
}
cout<<endl;
}
void Inorder_Use(BTree T,int i)
{
if(T[2*i+1]!='#')
{
Inorder_Use(T,2*i+1);
}
cout<<T[i];
if(T[2*i+2]!='#')
{
Inorder_Use(T,2*i+2);
}
}
- 后序
void Postorder(BTree T)
{
if(T[0]!='#')
{
Postorder_Use(T,0);
}
cout<<endl;
}
void Postorder_Use(BTree T,int i)
{
if(T[2*i+1]!='#')
{
Postorder_Use(T,2*i+1);
}
if(T[2*i+2]!='#')
{
Postorder_Use(T,2*i+2);
}
cout<<T[i];
}
- 层序
void Levelorder(BTree T)
{
int i=MAXSIZE-1,j;
while(T[i]=='#')
{
i--;
}
for(j=0;j<=i;j++)
{
if(T[j]!='#')
{
cout<<T[j];
}
}
}
四、其他
- 深度
不断除二,累计即可
int Depth(BTree T)
{
int i=0,j=MAXSIZE-1;
while(T[j]=='#')
{
j--;
}
j++;
while(j!=0)
{
j/=2;
i++;
}
return i;
}
- 某行某列节点的值
注意要include<math.h>
int Value(BTree T,int line,int order)
{
return T[(int)pow(2,line-1)+order-2];
}