按层次建立二叉树新算法

用完全二叉树的概念非递归地创建二叉树。

根据完全二叉树的编号以及特点来解决问题的,使用队列, 按照层次次序来
创建一棵二叉树。先将该二叉树扩充为完全二叉树, 然后再按层次次序依次存储到数组单元中, 即对该
二叉树采用顺序存储

将完全二叉树的各个结点的地址值按层次次序依次存储到数组单元中, 如果为虚结
点则它的地址为空 , 每存入一个结点的地址则队列的尾指针加 1

第i个元素出队, 头指针f加一, 同时在数组中找出该元素的左孩子和右孩子 ( 如果存在则它们
分别在数组的 2*i 和 2*i+1的位置上 )。将第i个元素的左孩子指针域指向 2*i它的右孩子指针域
指向2*i+1。

#include
#include
#include
#define maxlen 25
typedef struct BT {
char data;
struct BT *lchild,*rchild;
}Bnode,*BTree;

BTree Creat_tree()
{ char ch[20];

BTree root,p,duilie[maxlen];
int i=0,n,f=1,r=1; // f 为队列的头指针, r 为队列的尾指针
gets(ch);
n=strlen(ch);
while(1)
{ if(ch[i]=='0') break;
if(ch[i]=='*') p=NULL; // 为虚结点, 在数组中存储空值

else
{ p=(BTree)malloc(sizeof(Bnode));
p->data=ch[i];
p->lchild=NULL; p->rchild=NULL;
}

duilie[r++]=p; //p 结点入队, 尾指针加 1
if(i==0) root=p; / / 当前结点是根结点
i++;
}

while(f!=r) // 队列不空
{ p=duilie[f];
if(p!=NULL)
{ if(2*f<=n) p->lchild=duilie[2*f]; // 判断左孩子是否存在,左指针域指向左孩子.
if(2*f+1<=n) p->rchild=duilie[2*f+1];
}
f++; // 对头指针加 1 , 当前结点出队

}
return root;
}


int main()
{
BTree t1,t2;

printf("please input tree one data\n");
t1=Creat_tree();

printf("please input tree two data\n");
t2=Creat_tree();


return 0;
}





相关文档
最新文档