第六章 遍历二叉树及推导遍历结果(前序、中序和后续)

二叉树遍历方法

下面几种算法是利用递归的方法实现的
- 前序遍历:先打印输出,再先序遍历左子树,最后先序遍历右子树
- 中序遍历:中序遍历左子树,再打印,最后中序遍历右子树
- 后序遍历:先后序遍历左子树,再后序遍历右子树,最后打印输出
- 总结:前序是先打印,再左右;中序是先左,再打印,最后右;后序是先左右,再打印

推导遍历结果

前序遍历为ABCDEF,中序遍历为CBAEDF,问二叉树的后序遍历?

解:已知前序遍历是先打印,再左右,因此根结点是最先打印的,因此A为根结点。

再根据中序遍历,CB在根结点左边,EDF在右边,因此C、B在根结点左边,E、D、F在右边,如下图:
第六章 遍历二叉树及推导遍历结果(前序、中序和后续)_第1张图片
然后看前序的C和B,其顺序是B在C之前,因此B是A的左孩子,C是B的孩子,但不确定是左孩子还是右孩子。

此时看中序遍历,C在B之前,由于中序遍历是先左再打印最后右,可以确定C是B的左孩子。

再看E、D、F的关系,在前序遍历中,顺序为DEF,因此D是A的右孩子无疑,E和F是D的子孙,注意F不一定是孩子,可能是孙子。

看中序序列,顺序是EDF,E在D左侧,F在D的右侧,因此可以确定E是D的左孩子,F是D的右孩子。
第六章 遍历二叉树及推导遍历结果(前序、中序和后续)_第2张图片

最后,画出草图,其后序遍历就知道是CBEFDA了,注意检验画出草图的前序和中序遍历符合不符合题意。

中序序列为ABCDEFG,后序序列为BDCAFGE,求前序序列?

由于后序遍历是先左右,再打印,因此可知其根结点最后打印,根结点为E,再看中序序列,可知A 、B、C、D 为左子孙,F、G为右子孙。

由后序序列BDCA,知道A是E的左孩子(先左右再打印),再由中序序列ABCD,可知BCD是A的子孙,而且是右子孙(因为中序是先左再打印最后右,如果是左子孙A不可能是第一个打印出来的)。

再由后序序列BDCA,可知C是A的右孩子(因为BDC是A的右子孙,而C是最后输出的,所以最靠近A),最后再根据中序序列的ABCD的顺序可以看出来,B是C的左孩子,D是右孩子。

同理可以推出G是F的右孩子,F是G的左孩子,因此此序列的前序遍历结果是EACBDGF。

总结:已知前序和中序,后序和中序遍历序列之后,可以唯一确定一棵二叉树。但是,只知道前序和后序遍历序列,是无法知道哪个结点是左子树还算右子树。例如前序序列为ABC,后序序列是CBA。其可能为下列四种情况,而它们是不相同的:

第六章 遍历二叉树及推导遍历结果(前序、中序和后续)_第3张图片

你可能感兴趣的:(大话数据结构读书笔记)