已知层次序列及结点的度,求树的孩子-兄弟链表
一、算法思想
我们已知层次序列数组A[],以及各结点对应的度。可以创建一个临时链表组,先在组内存放一个个单个的结点,再将各结点通过父子关系链接。
例如,我们有
| 结点 | A | B | C | D | E |
| 度 | 2 | 2 | 0 | 0 | 0 |
这样的序列和度的情况【左图】。要转换为如下的孩子-兄弟链表【右图】。


先构造临时树temp【包括数据,左孩子,右兄弟指针】。在temp中各节点存放ABCDE数据,左右指针均为空。

获取第一个结点的度为2,则接下来的BC为其第一个孩子和第二个孩子,将第一个孩子B【k】赋给A【i】的左指针,之后的孩子依次赋值,如第二个孩子【k+1】给第一个孩子【k】的右指针【C是B的右孩子】,第三个孩子【k+2】给第二个孩子【k+1】的右指针....
i:遍历至第n个结点
k:指向接下来要处理的孩子。

接下来B的度为2,于是DE为其孩子,第一个孩子D【k】赋给B【i】的左指针,第二个孩子E【k+1】赋给第一个孩子D【k】。

接下来的结点孩子数均为0,此时树已经构造完毕。
二、代码
void createTree(Tree &T,DataType e[],int degree[],int n){
//T为要构造的树,e存放结点,degree存放度,n为结点个数
TreeNode *temp=new TreeNode[Maxsize];
for(int i=0;i<n;i++){
temp[i]->data=e[i]; //各位置存放单个结点
temp[i]->ch=temp[i]->bro=NULL; //孩子和兄弟置为空
}
int k=0;
for(int i=0;i<n;i++){ //遍历至第i个结点
d=degree[i]; //获取度
if(d){ //如果有孩子
temp[i]->ch=temp[++k]; //第一个孩子赋给孩子指针
for(int j=2;i<=d;j++){
temp[k]->bro=temp[k+1]; //其余孩子处理:后一个赋给前一个的兄弟指针
k++;
}
}
}
T=temp[0]; //树的根节点指向临时链的第一个结点
}

浙公网安备 33010602011771号