/**********
【题目】已知一棵树的由根至叶子结点按层次输出的
结点序列及每个结点的度。试编写算法,构造此树的
孩子兄弟链表。
孩子兄弟链表类型定义:
typedef struct CSTNode {
TElemType data;
struct CSTNode *firstChild, *nextSibling;
} CSTNode, *CSTree;
**********/
CSTNode* newNode(TElemType node){
CSTNode* p;
p=(CSTNode*)malloc(sizeof(CSTNode));
if(p==NULL) return NULL;
p->data=node;
p->firstChild=NULL;
p->nextSibling=NULL;
return p;
}
void BuildCSTree(CSTree &T, char *nodes, int *degrees)
/* 由结点的层序序列node和各结点的度degree构造树的孩子兄弟链表T */
{
if(!nodes) return;
int n=0;
int *deg=degrees;
int temp=*deg;
while(temp){
n++;
deg++;
temp=temp-1+*deg;
}
CSTree *ts;
ts=(CSTree*)malloc(n*sizeof(CSTree)); //依次添加进去的结点
ts[0]=newNode(nodes[0]);
T=ts[0];
if(!T) return;
int index=0;//遍历每一个结点的
int check=1;//表示还没添加进去的第一个结点
for(index=0;index<n;index++){
int chudu=degrees[index];
if(chudu==0) continue;//表示添加到叶子结点
ts[check]= newNode(nodes[check]);
ts[index]->firstChild=ts[check];
check++;//添加结点后,check++表示该结点已添加
//接下来添加nextSibling
for(int i=2;i<=chudu;i++){ //添加完 firstChild后,就是添加第二个出度
ts[check]= newNode(nodes[check]);
ts[check-1]->nextSibling=ts[check];
check++;
}
}
}
值得一提的是,下面实现计算数组指针的 包含的个数:
int n=0;
int *deg=degrees;
int temp=*deg;
while(temp){
n++;
deg++;
temp=temp-1+*deg;
}
网友评论