二叉树的深度优先遍历逆推

二叉树的深度优先遍历有三种方式,分别叫做先序遍历(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 。

以上就是二叉树的深度优先遍历逆推了。

二叉树的深度优先遍历逆推相关推荐

  1. 深度优先遍历_二叉树的深度优先遍历,理解框架真的能够套用题目吗?不了解执行过程可能很难。...

    显然这是一个很普通的二叉树的深度优先遍历,从中可以提取出这样的框架: class TreeNode { int val; TreeNode left, right; } public void isF ...

  2. PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次) 转载陈小龙哈2017...

    http://blog.csdn.net/baidu_30000217/article/details/52953127 前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点 ...

  3. 二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)

    二叉树的深度优先遍历(DFS)与广度优先遍历(BFS) 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点 ...

  4. php 实现二叉树的最大深度_PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)...

    前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 前序遍 ...

  5. 二叉树的深度优先遍历和广度优先遍历

    二叉树是一种很重要的数据结构,对于二叉树的遍历,有深度优先遍历和广度优先遍历,深度优先遍历又有先序.中序.后续遍历,广度优先遍历就是按层遍历. 1. 深度优先遍历 深度优先遍历,也就是先序.中序.后续 ...

  6. 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]

    深度优先搜索算法(Depth First Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点 ...

  7. java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...

    1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...

  8. 二叉树的深度优先遍历原理及python实现

    深度优先遍历 对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 那么深度遍历有重要的三种方法.这三种方式常被用于访问树的节点,它 ...

  9. 矮油~ 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]

    深度优先搜索算法(Depth First Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点 ...

最新文章

  1. 硬盘运行时断电会导致硬盘怎样
  2. 启用tomcat debug模式
  3. Android GraphicBuffer
  4. 下学期计算机教学工作计划,初中信息技术下学期教学工作计划
  5. 成都睿铂x云南省地矿测绘院:丽江玉龙高精度地籍免像控案例分享
  6. 度量网络延迟和吞吐量
  7. Google发布Chrome 8
  8. 构建企业级LAMMP环境
  9. 七月算法机器学习 7 工作流程与模型调优
  10. 单片机编程软件很简单(16),Keil单片机编程软件建立工程项目
  11. Ubuntu 中文输入法 fcitx框架和搜狗输入法的配置安装
  12. oracle 计算标准差函数,Oracle数据库之使用oracle来计算方差及标准差
  13. 初级程序员升中级程序员需要掌握哪些知识
  14. Halcon条形码识别
  15. uni-app省市区选择器
  16. 货代里美国海运双清是什么意思
  17. 翻译 python:能否把 if-elif-else写成一行的形式?
  18. 如下现有一个保险政策类InsurancePolicy
  19. 编辑PDF书签的软件
  20. Excel工具 - 合并多个同类Excel

热门文章

  1. Python + Selenium + Chrome 使用代理 auth 的用户名密码授权
  2. Facebook想用机器人取代App
  3. 设置环境变量ANDROID_SDK_HOME有什么用?
  4. 移动端手机火狐浏览器全屏插件
  5. linux/bsd四大防火墙我们选择谁
  6. 求带权中位数的Select算法
  7. Linux Bash Shell编程快速入门
  8. ASP.NET 2.0 中动态添加 GridView 模板列
  9. 探索HTTP传输中gzip压缩的秘密
  10. Map 和 WeakMap