第六章 遍历二叉树及推导遍历结果(前序、中序和后续)
来源:互联网 发布:seo关键词排名优化 编辑:程序博客网 时间:2024/05/22 08:11
二叉树遍历方法
下面几种算法是利用递归的方法实现的
- 前序遍历:先打印输出,再先序遍历左子树,最后先序遍历右子树
- 中序遍历:中序遍历左子树,再打印,最后中序遍历右子树
- 后序遍历:先后序遍历左子树,再后序遍历右子树,最后打印输出
- 总结:前序是先打印,再左右;中序是先左,再打印,最后右;后序是先左右,再打印
推导遍历结果
前序遍历为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为右子孙。
由后序序列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。其可能为下列四种情况,而它们是不相同的:
- 第六章 遍历二叉树及推导遍历结果(前序、中序和后续)
- 二叉树的前序,中序及后续遍历
- 由二叉树的前序遍历和后续遍历结果还原二叉树,并后序遍历打印
- 二叉树--已知前序遍历和中序遍历,输出后续遍历
- 编程实现二叉树的建立,前序遍历,中序遍历和后续遍历
- 由前序遍历和中序遍历重建二叉树,再实现后续遍历
- 根据前序遍历和后续遍历建立二叉树
- 阿里笔试-二叉树由前序遍历和中序遍历推导后序遍历
- c++ 二叉树的构建 前序遍历 中序遍历 后续遍历 层次遍历
- 由二叉树的前序遍历和中序遍历来求后序遍历的结果
- 二叉树的前序、中序、后续遍历
- 二叉树问题-根据前序遍历结果和中序遍历结果得出后序遍历结果
- 二叉树的基本操作,前序遍历,后续遍历,中序遍历
- java版本_二叉树(前序遍历,中序遍历,后续遍历)
- leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现
- python实现二叉树,前序遍历,中序遍历,后续遍历
- 由前序遍历与中序遍历生成二叉树及二叉树的前序,中序,后续,层序遍历
- 根据二叉树的前序遍历和中序遍历的结果,重建二叉树
- 带有进度信息的对话框
- python3+PyQt5 泛型委托
- MYSQL中replace into的用法
- 【Android】- Android Service的两种启动方式
- java 抽象类
- 第六章 遍历二叉树及推导遍历结果(前序、中序和后续)
- String 、StringBuffer 与StringBuilder的异同
- Java解惑学习有感(二)---字符之谜
- jercy实现跨服务器上传图片+回显
- React Native常见问题解答(一)
- FFmpeg 使用指南
- oracle杀掉被锁住的进程
- 关于Linux的认识和基本指令
- composer 安装