
/*
从所给的树的层次遍历及其节点度数,构造孩子兄弟链表
分析:
这里设计到层次遍历,还有孩子-兄弟链表,较为复杂。我们可以设立一个类型为树节点的数组,
将层次序列里面的所有值放到该数组中,将其所有节点的fch和sub值为空
然后一次去遍历节点,取出度数d,若d>0,说明该节点有孩子,将第一个孩子放到左指针fch,其他孩子
一次放到sub中,注意这里会有变化,代码里再详说
*/
typedef struct node {
char data;
node *fch, *nsib;
}Tree;
#include<stdio.h>
#include <stdlib.h>
void createCSTree_degree(char *level, int *degree, node **pointer, int n) {
int k = 0;//判断到了哪个节点
for (int i = 0; i < n; i++) {//初始化pointer
pointer[i]->data = level[i];
pointer[i]->fch = NULL;
pointer[i]->nsib = NULL;
}
for (int i = 0; i < n; i++) {
int d = degree[i];
if (d) {
k++;//k为子女节点序号
pointer[i]->fch = pointer[k];
for (int j = 0; j < d - 1; j++) {
k++;
pointer[k - 1]->nsib = pointer[k];
}
}
}
}
void inOrder(node *T) {
if (T) {
inOrder(T->fch);
printf("%c ", T->data);
inOrder(T->nsib);
}
};
int main() {
char level[6] = { 'A','B','E','G','D','F' };//层次遍历,用数组存储
int degree[] = { 3,2,0,0,0,0 };
node* *pointer = (node* *)malloc(sizeof(node*) * 6);
for (int i = 0; i < 6; i++) {
pointer[i] = (node*)malloc(sizeof(node*));
}
createCSTree_degree(level, degree, pointer, 6);
inOrder(pointer[0]);
}