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