题目
已知非空二叉树采用顺序存储结构,结点的数据信息依次存储在数组BT[0…MAXZize-1]中(若元素为0,表示在二叉树中不存在),请写一算法,生成该二叉树的链表结构。
分析
循环到某一点BT[i]时,主要是求结点的双亲结点,BT[i]结点到底链接在谁的的孩子结点,这是个主要的问题。
- 计算双亲结点时,j=(i-1)/2;
- 到底是j的左孩子还是右孩子呢
(1)若i-2*j-1==0,说明是j的左孩子。
(2)若i-2*j-1!=0 说明是j的右孩子
代码
基本数据类型
后面的代码可能会出现相似的数据类型,后面就不重复写了。
#define MAXSize 100
typedef struct bNode{
int data;
struct bNode *lchild,*rchild;
}BTNode,*BTREE;
#define len sizeof(BTNode)
核心代码
// 建立二叉树链表结构
BTREE CTREATEBLINK(int BT[],int n){
BTREE T=NULL,PRT[MAXSize];
int j=0;
PRT[j]=(BTREE) malloc(len);
PRT[j]->data=BT[0];
PRT[j]->rchild =NULL;
PRT[j]->lchild= NULL ;
T=PRT[j];
for (int i = 1; i < n; i++) {
if (BT[i]!=0) {
PRT[i]=(BTREE) malloc(len);
PRT[i]->data=BT[i];
PRT[i]->rchild =NULL;
PRT[i]->lchild= NULL ;
j = (i-1)/2;
if (i-2*j-1==0) {
PRT[j]->lchild=PRT[i];
}else {
PRT[j]->rchild=PRT[i];
}
} // if
}// for
return T;
}