6.7.2 森林的遍历

算法6.12
  void InOrderTraverse_Tree(CSTree T,void(*visit)( CSTree ))
 {
  // 以孩子-兄弟链表作存储结构,中序遍历指针T所指森林
  // (或后根遍历T所指树)

  if (T) {             // T=NULL时,森林为空,不做任何操作
   InOrderTraverse_Tree(T->firstchild, visit); // 中序遍历*T的子树森林
   visit(T);            // 通过函数指针 *visit 访问根结点
   InOrderTraverse_Tree(T->nextsibling, visit);// 中序遍历其余树的森林
  } // if
 }

  也可以将算法6.12改写成如下形式:

  void InOrderTraverse_Tree(CSTree T,void(*visit)( CSTree ))
 {
  // 以孩子-兄弟链表作存储结构,中序遍历指针T所指森林
  p=T;                    // 指针p指向第一棵树的根
  while (p) {
   InOrderTraverse_Tree(p->firstchild, visit); // 中序遍历*p的子树森林
   visit(p);            // 通过函数指针*visit 访问根结点*p
   p=p->nextsibling;             // 指针p移向下一棵树的根
  } // while
 }
   
 
 
 
  如果将上页后根遍历的例树视作只含一棵树的森林,则上页后根遍历的动画即为按算法6.12进行遍历的过程。
 
 
 
  
 
 
 
 
  思考题 你能否从树和森林的递归定义解说此算法?