6.7.3 森林的其它操作算法举例

 一、求森林的深度

  森林的深度 = Max{每一棵树的深度}
  树的深度 = 其子树森林的深度+1

  由此可见,求树的深度应该是对树进行后根遍历,即对森林进行中序遍历。

算法6.13
  int Depth_Tree( CSTree T )
 {
  // T 是以孩子-兄弟链表存储的森林的头指针,返回该森林的深度
  if (!T) return 0;
  else {
   dep = 0;             // 初始化森林的深度为0
   p = T;              // 指针 p 指向第一棵树的根
   while (p) {
    d = Depth_Tree(p->firstchild);  // 返回 *p 的子树森林的深度
    if (d+1>dep) dep=d+1;      // 求各棵树的深度的最大值
    p=p->nextsibling;         // 指针 p 移向下一棵树的根
   } // while
   return dep;
  } // else
 } // Depth_Tree
   
 
 
  可以将树看成是"只含一棵树的森林",由此树和森林的操作是完全一致的,本小节讨论如何通过遍历实现森林的其它操作。

  当以孩子-兄弟链表作树和森林的存储结构时,其遍历算法和二叉树的遍历算法类似,但在实现其它操作时一定要注意不要和二叉树混淆,在孩子-兄弟链表的结点中的两个指针指示的关系不同,左指针指向"孩子",而右指针指向"兄弟"。

  思考题 将此算法和上页的中序遍历森林的算法相对比,你发现了什么?