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

 二、输出森林中每一棵树中从根到所有叶子结点的路径

  从树的根结点出发,沿着各个分支可以到达所有叶子结点,由途径所有结点构成的结点序列称为从根到叶的路径,途径分支个数称作路径长度。

例题 例如,对右图中所示森林,从每一棵树的根到各个叶子结点的路径从左到右依次为:
   BEH
   BEI
   BEJ
   RCP
   ADF
   ADGK

  从这个例子所得结果可见,树的路径为(根结点)加上(子树森林中每一棵树从根到叶的路径)。由此,应对森林进行先序遍历,算法如下。

算法 算法6.14
  void OutPath( CSTree T )
 {
  // 依次从左到右输出森林中每一棵树中从根到叶的路径
  // 森林的存储结构为孩子-兄弟链表,T为头指针

  Stack S;
  if (T) {
   Push(S, T->data);              // 根结点加入路径
   if (!T->firstchild) StackTraverse(S, output); // 求得一条路径
   else OutPath(T->firstchild);        // 遍历子树森林
   Pop(S);                  // 从路径中删除栈顶结点
   OutPath(T->nextsibling);          // 遍历其余树的森林
  } // if
 } // OutPath
   
 
 
 
   

  算法6.14即为对森林进行先序遍历,其中的"访问"操作即为"将根结点加到路径上",如果该树没有子树,则得到一条路径;同时,由于各棵树互不相交,即第一棵树的结点一定不是其余树中从根到叶路径中的结点,因此在遍历子树森林之后,即在求以它的兄弟为根的树中路径之前,应该将本树的根结点从路径中删除。