美文网首页
层次遍历给出各结点的度,构造树的孩子兄弟链表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

    值得一提的是,下面实现计算数组指针的 包含的个数:

  • sibling 兄弟 根节点:度:结点拥有的子树数(叶结点、分支结点),树的度是各个结点度的最大值。层次:森林:m...

  • 常见数据结构-Java

    一、链表 二、二叉树 前序遍历-先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历-先遍历输出左结点,再...

  • 算法学习笔记——二叉树

    树的基本术语 节点的度:节点拥有的子树数树的度:树内各结点的度的最大值深度:树中结点的最大层次其他术语:叶子(终端...

  • 树 基本术语 结点结点的度:拥有子树的个数叶子结点:度为0分支结点:度不为0孩子,双亲和兄弟结点的层数树的深度树的...

  • 数据结构_知识点_树

    关于树的基本术语 祖先结点,子孙结点 双亲结点,孩子结点 兄弟结点 结点的度 分支节点(度为0),叶子节点(又称终...

  • 二叉树层次遍历

    二叉树层次遍历,又称为宽度优先搜索,按树的层次依次访问树的结点。层次遍历使用队列对遍历节点进行 存储,先进入队列的...

  • 1-a. 链表逆序

    已知链表头结点指针head,将链表逆序。(不可申请额外空间) 如图: 解题思路: 依次遍历链表结点,每遍历一个结点...

  • python-链表-实现-判空-长度-遍历-增加结点-删除结点-

    一、链表-实现-判空-长度-遍历-增加结点: 链表的实现、判断是否为空、长度、遍历 头部增加新结点 尾部增加结点 ...

  • iOS单链表逆序

    算法:t遍历链表, q记录t的上一个结点, p是一个临时变量用来缓存t的值。

网友评论

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

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