孩子兄弟链表构造算法(1)

已知一棵树的由根至叶子结点按层次输入的结点序列及每个结点的度(每层中自左至右输入),试写出构造此树的孩子兄弟链表算法。

脑子里过了一下觉得没问题,没有实测,如有问题望读者及时指出,万分感激。


typedef struct CSNode {
	ElemType  data;
	struct CSNode  *firstchild, *nextsibling;
}CSNode, *CSTree;
CSNode* SearchTree(CSTree T,Elemtype x){  
    CSTree temp1,temp2;
    if(T == NULL)return NULL;
    if(T->data == x)return T;
    else{
		temp1 = SearchTree(T->firstchild,x);
        temp2 = SearchTree(T->nextsibling,x);
        if(temp1 != NULL) return temp1;
        return temp2;
    }
}//在树T中查找x
CSNode* CreatCSTreeNode(Elemtype E){
	CSNode *p = (CSNode*)malloc(sizeof(CSNode));
	p->data = E;
	p->firstchild = p->nextsibling = NULL;
	return p;
}//创建孩子兄弟链表结点
void BuildCSTree(CSTree &T, Elemtype *node, int *degree, int N){
	//T为根节点,node为节点序列,degree为对应度数序列,N为链表结点总数
    int child = 0/**结点孩子数**/,index = 1/**结点序列指针,指向下一个要加入的结点**/,i = 0/**要加入孩子的结点的指针**/;
    CSNode *p,*q,*temp;
    T = CreatCsTreeNode(node[0]);   //将树指向该节点,也就是将该节点作为树的根节点
    temp = T; //用一个标记指针指向根节点
    while(i < N) {//遍历所有要输入的节点的值。
		q = temp;   //将q指针也指向根节点;    
        child = degree[i]; //获取要输入节点它的孩子的个数;
        for(int j = 0;j < child;j++){//创建子节点
            p = CreatCsTreeNode(node[index++]);
            if(j == 0){  //如果是新一层的第一个节点
                q->firstchild = p;   //将该节点作为父节点的第一个孩子;
                q = q->firstchild;   //并将q指向新一层的第一个节点;
            }
            else{  //如果不是新一层的第一个节点
                q->nextsibling = p;  //将该节点作为上一节点的下一孩子节点;
                q = q->nextsibling;  //并将q指向它的兄弟,也就是下一个孩子节点;
            }
        }
        i++; //后移,为了统计输入的下一个节点包含有多少个度,并创建相应的孩子;
        if(i < N)temp = SearchTree(T,node[i]);//查找输入的下一个节点,并指向那个节点,然后才能创建它相应的孩子;
  }
}

你可能感兴趣的:(数据结构)