二叉树的深度优先遍历逆推
二叉树的深度优先遍历逆推
二叉树的深度优先遍历有三种方式,分别叫做先序遍历(preorder)、中序遍历(inorder)和后序遍历(postorder),它们之间的不同在于访问每个节点的次序不同。
参考:https://blog.csdn.net/weixin_43790276/article/details/105473527
一、二叉树的遍历逆推
先序遍历的遍历顺序为:根节点 -> 左子树 -> 右子树。
中序遍历的遍历顺序为:左子树 -> 根节点 -> 右子树。
后序遍历的遍历顺序为:左子树 -> 右子树 -> 根节点。
对于二叉树的三种遍历方式,当知道了其中的任意两种遍历方式,就可以唯一确定一棵树的结构,然后顺利地得到第三种遍历的顺序。
已知先序遍历和中序遍历的遍历顺序,可以先逆推出树的结构,然后得出后序遍历的遍历顺序。同理,已知先序遍历和后序遍历的遍历顺序,可以逆推出中序遍历的遍历顺序,已知中序遍历和后序遍历的遍历顺序,也可以逆推出先序遍历的遍历顺序。
二、二叉树遍历逆推案例
现有一棵二叉树,已知二叉树的先序遍历顺序和中序遍历顺序。
先序遍历的顺序为:A G B E J H C D F I 。
中序遍历的顺序为:B G J E H A D C I F 。
请写出该二叉树的后序遍历顺序。
要得到二叉树的后序遍历,先逆推出二叉树的结构。
1. 先看先序遍历结果,访问的第一个节点一定是根节点,所以可以确定树的根节点是 A。带着这个信息看中序遍历结果,中序遍历是先遍历左子树,根节点在中间,最后遍历右子树,所以从中序遍历的结果中找到 A,A 左边的节点全部都在左子树中,A 右边的节点全部都在右子树中。
根据第一步分析,初步得出二叉树的伪结构如下图。
2. 现在还差左子树的结构和右子树的结构不明确,先分析左子树,从先序遍历结果和中序遍历结果中将左子树的节点独立出来。
左子树先序遍历的顺序为:G B E J H 。
左子树中序遍历的顺序为:B G J E H 。
在左子树中,先序遍历第一个访问的节点一定是根节点,所以可以确定左子树的根节点是 G。带着这个信息看中序遍历结果,从中序遍历的结果中找到 G,G 左边的节点全部都在 G 的左子树中,G 右边的节点全部都在 G 的右子树中。
分析到这里,可以得出左子树的伪结构如下图。
3. 用相同的方法分析右子树,从先序遍历结果和中序遍历结果中将右子树的节点独立出来。
右子树先序遍历的顺序为:C D F I 。
右子树中序遍历的顺序为:D C I F 。
在右子树中,先序遍历第一个访问的节点一定是根节点,所以可以确定左子树的根节点是 C。带着这个信息看中序遍历结果,从中序遍历的结果中找到 C,C 左边的节点全部都在 C 的左子树中,C 右边的节点全部都在 C 的右子树中。
于是,可以得出右子树的伪结构如下图。
4. 将左子树和右子树拼接到根节点上,二叉树的伪结构如下图,又进了一步。
5. 现在还差节点 G 的右子树和节点 C 的右子树结构不明确,快速用相同的方法分析,结构分别为下图中的图左和图右。
6. 将子树拼接回二叉树中,得出了二叉树的完整结构如下图。
7. 逆推出了树的结构,可以快速得出二叉树后序遍历的顺序了。
后序遍历的顺序为:B J H E G D I F C A 。
总结上面的过程,都是先在先序遍历中找到根节点,然后在中序遍历中切分左子树和右子树,再递归。如果已知中序遍历和后序遍历的顺序,也可以先在后序遍历中找到根节点,然后在中序遍历中切分左子树和右子树,再递归即可。
三、二叉树遍历逆推案例二
如果已知的是先序遍历和后序遍历的顺序,先序遍历和后序遍历都可以轻易找到根节点,但是没有中序遍历来切分左右子树,怎么逆推出中序遍历呢?
直接看案例吧,已知二叉树的先序遍历顺序和后序遍历顺序。
先序遍历的顺序为:10 70 60 20 40 90 50 80 30 。
后序遍历的顺序为:60 40 90 20 70 80 30 50 10 。
请写出该二叉树的中序遍历顺序。
1. 先看先序遍历结果,访问的第一个节点一定是根节点,所以可以确定树的根节点是 10。先序遍历访问完根节点后,会先访问左子树再访问右子树,左子树的节点一定都排在右子树的前面,并且访问左子树也是先访问根节点,所以访问的第二个节点一定是左子树的根节点,左子树的根节点是 70。
带着这个信息看后序遍历结果,后序遍历的根节点一定排在其他节点的最后,左子树也一样,左子树的根节点也一定排在左子树其他节点的最后。左子树的根节点是 70,所以 70 及左边的节点全部都在左子树中,除了根节点,70 右边的节点全部都在右子树中。
这样,就分析出了树的根节点是 10,左子树中的节点为 60 40 90 20 70,右子树中的节点为 80 30 50。
2. 现在将左子树独立出来分析,在后序遍历中已经找到了左子树的全部节点,共5个节点,直接将这个5个节点独立出来即可。到先序遍历中,去掉根节点,按顺序取5个节点,就是左子树的先序遍历。
左子树先序遍历的顺序为:70 60 20 40 90 。
左子树后序遍历的顺序为:60 40 90 20 70 。
用同样的方法进行分析,可知 70 的左子树只有 60 一个节点,70 的右子树有 40 90 20 三个节点。
3. 继续用同样的方法对右子树分析,如果左子树和右子树中还有子树,继续使用相同的方法递归逆推。
4. 最终得出树的结构如下图。
5. 逆推出了树的结构,可以快速得出二叉树中序遍历的顺序了。
中序遍历的顺序为:60 70 40 20 90 10 80 50 30 。
以上就是二叉树的深度优先遍历逆推了。
二叉树的深度优先遍历逆推相关推荐
- 深度优先遍历_二叉树的深度优先遍历,理解框架真的能够套用题目吗?不了解执行过程可能很难。...
显然这是一个很普通的二叉树的深度优先遍历,从中可以提取出这样的框架: class TreeNode { int val; TreeNode left, right; } public void isF ...
- PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次) 转载陈小龙哈2017...
http://blog.csdn.net/baidu_30000217/article/details/52953127 前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点 ...
- 二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)
二叉树的深度优先遍历(DFS)与广度优先遍历(BFS) 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点 ...
- php 实现二叉树的最大深度_PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)...
前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 前序遍 ...
- 二叉树的深度优先遍历和广度优先遍历
二叉树是一种很重要的数据结构,对于二叉树的遍历,有深度优先遍历和广度优先遍历,深度优先遍历又有先序.中序.后续遍历,广度优先遍历就是按层遍历. 1. 深度优先遍历 深度优先遍历,也就是先序.中序.后续 ...
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
深度优先搜索算法(Depth First Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点 ...
- java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...
1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...
- 二叉树的深度优先遍历原理及python实现
深度优先遍历 对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 那么深度遍历有重要的三种方法.这三种方式常被用于访问树的节点,它 ...
- 矮油~ 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
深度优先搜索算法(Depth First Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点 ...
最新文章
- 硬盘运行时断电会导致硬盘怎样
- 启用tomcat debug模式
- Android GraphicBuffer
- 下学期计算机教学工作计划,初中信息技术下学期教学工作计划
- 成都睿铂x云南省地矿测绘院:丽江玉龙高精度地籍免像控案例分享
- 度量网络延迟和吞吐量
- Google发布Chrome 8
- 构建企业级LAMMP环境
- 七月算法机器学习 7 工作流程与模型调优
- 单片机编程软件很简单(16),Keil单片机编程软件建立工程项目
- Ubuntu 中文输入法 fcitx框架和搜狗输入法的配置安装
- oracle 计算标准差函数,Oracle数据库之使用oracle来计算方差及标准差
- 初级程序员升中级程序员需要掌握哪些知识
- Halcon条形码识别
- uni-app省市区选择器
- 货代里美国海运双清是什么意思
- 翻译 python:能否把 if-elif-else写成一行的形式?
- 如下现有一个保险政策类InsurancePolicy
- 编辑PDF书签的软件
- Excel工具 - 合并多个同类Excel