第六章 遍历二叉树及推导遍历结果(前序、中序和后续)
2017-04-20 13:53
274 查看
二叉树遍历方法
下面几种算法是利用递归的方法实现的- 前序遍历:先打印输出,再先序遍历左子树,最后先序遍历右子树
- 中序遍历:中序遍历左子树,再打印,最后中序遍历右子树
- 后序遍历:先后序遍历左子树,再后序遍历右子树,最后打印输出
- 总结:前序是先打印,再左右;中序是先左,再打印,最后右;后序是先左右,再打印
推导遍历结果
前序遍历为ABCDEF,中序遍历为CBAEDF,问二叉树的后序遍历?
解:已知前序遍历是先打印,再左右,因此根结点是最先打印的,因此A为根结点。再根据中序遍历,CB在根结点左边,EDF在右边,因此C、B在根结点左边,E、D、F在右边,如下图:
然后看前序的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的右孩子。
最后,画出草图,其后序遍历就知道是CBEFDA了,注意检验画出草图的前序和中序遍历符合不符合题意。
中序序列为ABCDEFG,后序序列为BDCAFGE,求前序序列?
由于后序遍历是先左右,再打印,因此可知其根结点最后打印,根结点为E,再看中序序列,可知A 、B、C、D 为左子孙,F、G为右4000
子孙。
由后序序列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。其可能为下列四种情况,而它们是不相同的:
相关文章推荐
- 二叉树--已知前序遍历和中序遍历,输出后续遍历
- 二叉树的前序、中序、后续遍历
- 面试题6:重建二叉树,输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树。
- 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5
- 3.9已知二叉树的 前序遍历和中序遍历的结果,重构出原二叉树
- 二叉树非递归遍历,不使用栈(前序,中序,后续)
- 一直二叉树的前序遍历和中序遍历的结果,重建该二叉树 Java代码实现
- 输入某二叉树的前序遍历和中序遍历的结果请重建出该二叉树。
- PHP 使用二叉树的先序和中序遍历结果构造二叉树
- 二叉树的三种遍历递归法和非递归法(前序、中序、后续)
- java 创建二叉树 前序、中序、后续 递归遍历树 和 非递归遍历,递归求树高,递归求树节点数
- 二叉树的前序、中序、后续遍历,递归、非递归实现
- 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
- 已知二叉树的前序遍历和中序遍历的结果,重建二叉树
- 二叉树的各种遍历(先序、中序、后续、层次)——递归、非递归
- 已知一颗二叉树S的前序遍历和中序遍历序列,请编程输出二叉树S的后续遍历序列。
- 根据先序和中序遍历结果画出二叉树
- 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5
- 根据前序和中序遍历的结果建立二叉树
- java 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。