本文为个人理解,若有错误欢迎指正!
这里说的树当然是指普通的树,而不是树中比较特别的二叉树。
1.为什么普通树没有中序遍历
中序遍历是对于二叉树而言:
中序遍历左子树,访问根结点,中序遍历右结点。
在普通树中并不一定只有左右两颗子树,例如在下图中:
中序遍历:先访问左子树A,那么接下来要访问的点是B,还是R,是有歧义的,所以普通树没有中序遍历。
我们再来看看普通树的先序遍历和后序遍历:
(这里的遍历规则摘自严蔚敏的 《数据结构(C语言版 第2版)》p135)
先序遍历:先访问树的根结点,然后依次先序遍历根的每棵子树,其顺序为RABDECF。
后序遍历:先依次后序遍历每棵子树,然后访问根结点,其顺序为ADEBFCR。
这里由于普通树转成二叉树的特点,可以发现普通树的先序遍历等于其转化成的二叉树的先序遍历,后序遍历等于其转化成的二叉树的中序遍历,我们也可以发现二叉树的后序遍历在普通树中没有对应的遍历规则。
2.为什么森林没有后序遍历
以下图为例:
(这里右边图的“一整棵”主要是区分左下的多棵树)
这里我们先看森林的先序遍历和中序遍历:
(这里的遍历规则摘自严蔚敏的 《数据结构(C语言版 第2版)》p135)
森林的先序遍历规则:
(森林非空)
1.访问森林中第一棵树的根结点;
2.先序遍历第一棵树的根结点的子树森林;
3.先序遍历除去第一棵树之后剩余的树构成的森林。
就是对森林的每棵树进行先序遍历,这里的森林的先序遍历是ABCDEFGHIJK。
森林的中序遍历规则:
(森林非空)
1.中序遍历森林中第一颗树之后剩余的树构成的森林;
2.访问第一颗树的根结点;
3.中序遍历除去第一颗树之后剩余的树构成的森林。
就是对森林的每棵树进行后序遍历,这里的森林的中序遍历是BCDAFEIJHKG。
这里森林的中序遍历为何是森林中每棵树的后序遍历?我们在第一个问题有说到普通树的后序遍历等于其转化成的二叉树的中序遍历,所以这里我们可以看作以森林(森林中有n棵普通树,n>=0)转化成的一整棵二叉树的中序遍历作为遍历规则,所以本质上就是中序遍历。这也是森林为什么没有后序遍历的原因,因为森林的遍历实质上是看森林转化而成的一整棵二叉树,森林的xx遍历结果其实就是其转换而成的一整棵二叉树的xx遍历结果(就好像是在森林的遍历规则中就帮你做了从森林中的n棵普通树到一整棵二叉树的转换),而且我们在第一个问题有提到,二叉树的后序遍历在普通树中没有对应的遍历规则,所以森林没有后序遍历。
参考文章:
https://blog.youkuaiyun.com/ccqccq007/article/details/77430888?spm=1001.2014.3001.5506