转载自:https://blog.csdn.net/u011240016/article/details/52824161
树和森林的遍历
@(数据结构)
不要带着二叉树的遍历来限制了对树的遍历的理解。
树的遍历的定义:以某种方式访问树中的每一个结点,且仅访问一次。
树的遍历主要有先根遍历和后根遍历。
先根遍历:若树非空,则先访问根结点,再按照从左到右的顺序遍历根结点的每一棵子树。这个访问顺序与这棵树对应的二叉树的先序遍历顺序相同。
后根遍历:若树非空,则按照从左到右的顺序遍历根结点的每一棵子树,之后再访问根结点。其访问顺序与这棵树对应的二叉树的中序遍历顺序相同。
根据这幅图:
树的先根遍历:A-B-E-F-G-C-H-D-I-J
对应的二叉树的先序遍历:A-B-E-F-G-C-H-D-I-J
二者是一致的。
树的后根遍历:E-F-G-B-H-C-I-J-D-A
对应的二叉树的后序遍历:G-F-E-H-J-I-D-C-B-A
对应的二叉树的中序遍历:E-F-G-B-H-C-I-J-D-A(与树的后根遍历相一致)
注意到我们并没有定义一般树的中根遍历,因为子结点该怎么分两部分并没有定义,所以只定义先、后根。
以上只是模拟证实。
森林的遍历:需要澄清的是,只有二叉树森林才有中序遍历与完整二叉树中序遍历对应
先序遍历森林。
- 若森林非空,访问森林的第一棵树的根结点。
- 先序遍历第一棵树中根结点的子树
- 先序遍历除去掉遍历过的树的森林
中序遍历森林:普通的树构成的森林是不存在中序遍历的,这里的中序遍历必然指代的是化成二叉树的森林。
后序遍历也可以相似定义。
我们看这个森林和二叉树的各种遍历。
森林的先根遍历:A-B-C-D-E-F-G-H-J-I
二叉树森林的先序遍历:A-B-C-D-E-F-G-H-J-I(相同)
完整二叉树的先序遍历:A-B-C-D-E-F-G-H-J-I (相同)
森林的后根遍历:B-C-D-A-F-E-J-H-I-G
二叉树森林的后序遍历:D-C-B-A-F-E-J-I-H-G
完整二叉树的后序遍历:D-C-B-F-J-I-H-G-E-A(不同于二叉树森林的后序遍历)
二叉树森林的中序遍历:B-C-D-A-F-E-J-H-I-G(与森林的后根遍历相同)
完整二叉树的中序遍历:B-C-D-A-F-E-J-H-I-G(与森林的后根遍历相同,自然也与二叉树森林的中序遍历相同)
以上。