美文网首页
层次遍历给出各结点的度,构造树的孩子兄弟链表T

层次遍历给出各结点的度,构造树的孩子兄弟链表T

作者: HungerDeng | 来源:发表于2018-10-10 17:31 被阅读0次
    /**********
    【题目】已知一棵树的由根至叶子结点按层次输出的
    结点序列及每个结点的度。试编写算法,构造此树的
    孩子兄弟链表。
    孩子兄弟链表类型定义:
    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;       
         }   
    

    相关文章

      网友评论

          本文标题:层次遍历给出各结点的度,构造树的孩子兄弟链表T

          本文链接:https://www.haomeiwen.com/subject/bjjzgxtx.html