已知层次序列及结点的度,求树的孩子-兄弟链表

一、算法思想

我们已知层次序列数组A[],以及各结点对应的度。可以创建一个临时链表组,先在组内存放一个个单个的结点,再将各结点通过父子关系链接。

例如,我们有

结点 A B C D E
2 2 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];        //树的根节点指向临时链的第一个结点
}

 

posted @ 2020-04-03 12:13  大帅本帅  阅读(51)  评论(0)    收藏  举报