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

一、算法思想

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

例如,我们有

结点ABCDE
2200

这样的序列和度的情况【左图】。要转换为如下的孩子-兄弟链表【右图】。

先构造临时树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];        //树的根节点指向临时链的第一个结点
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值