已知一棵树的层次序列以及每个结点的度,编写算法构造此树的孩子兄弟链表
算法思想:已知先序遍历以及结点度数我们只需要编写代码给每一个除根结以外的结点寻找他们的兄弟和孩子(利用度数寻找孩子与兄弟,利用层次遍历构造辅助数组)详见代码
void createCSTree_Degree(CSTree *&T,int data[],int degree[],int n){
CSTree **temp=(CSTree**)malloc(sizeof(CSTree)*n); //创建临时数组
for(int i=0;i<n;i++){ //把每一个节点放进临时数组
temp[i]=(CSTree*)malloc(sizeof(CSTree));
temp[i]->data=data[i];
temp[i]->lchild=temp[i]->sright=NULL; //初始化兄弟与孩子结点
}
//构造完临时数组之后我们得到了先序序列的结点数组接下来我们根据结点的度来确定每一个结点的儿子与儿子的兄弟结点
int index=1; //指向数组还未操作的结点 默认根节点已经被操作了
int d;//d表示当前结点的度数;
for(int j=0;j<n;j++){
d=degree[j]; //获取当前结点的度数
//接下来找他的儿子与儿子兄弟
//首先要知道叶子结点的是没有兄弟和孩子的所以先进行一个判断 注:叶子结点的度数为0
if(d){ //若不是叶子结点 开始找儿子
temp[j]->lchild=temp[index]; //首先找到第一个儿子结点
for(int k=2;k<=d;k++){ //然后给第一个儿子结点找兄弟结点 注意 k=2 表示的是 从第二个孩子开始 一共有 d孩子 d是度数
index++;
temp[index-1]->sright=temp[index]; //index -1 为上一个孩子结点也就是 父节点的第一个孩子/或者是上一个孩子的兄弟 剩下的孩子结点依次是上一个孩子的右兄弟
}
}
}
//找完所有孩子结点与孩子的兄弟结点后就返回头指针 //注意这里是函数参数返回的
T=*temp;
}
构造过程大概就是这样