在经典二叉树问题中,还有一类题目,那就是给定深度优先遍历序列三种顺序中的两种,反推一棵二叉树的结构图。实际上这种问题具有很强的技巧性,只要我们记住这一技巧,就能够很容易的推断出整个二叉树的结构。
请记住如下规律:中序定左右,树根看先后
但是需要注意的是:在给定的深度优先遍历序列的两种序列中,只有包含中序遍历序列的情况下,才能唯一确定一个二叉树的结构

1、先序序列+中序序列的逆推过程

通过先序序列和中序序列逆推二叉树的步骤如下:

  • 步骤1:在先序序列中最先出现的节点就是整个二叉树的根节点;
  • 步骤2:在中序序列中找到根节点的位置,根节点左边的所有节点就是树根左子树的构成,根节点右边的所有节点就是树根右子树 的构成;
  • 步骤3:使用中序序列的左子树部分,在先序序列中进行查找,在先序序列中最先出现的节点就是左子树的树根;
  • 步骤4:使用中序序列的右子树部分,在先序序列中进行查找,在先序序列中最先出现的节点就是右子树的树根;
  • 步骤5:确定左右子树的树根节点之后,重复步骤1-­5,直到先序序列和中序序列中的所有元素全部使用过为止,二叉树构建完成。

通过先序序列和中序序列构建二叉树过程如图所示:

2、后序序列+中序序列的逆推过程

通过后序序列和中序序列逆推二叉树结构的方式和前面的通过先序序列和中序序列逆推二叉树结构的过程基本相似,只是现在确定子树树根节点的方式变成了:在后序序列中,最后出现的节点才是整个二叉树或者左右子树的树根节点。
通过后序序列和中序序列逆推二叉树的步骤如下:

  • 步骤1:在后序序列中最后出现的节点是整个二叉树结构的根节点
  • 步骤2:在中序序列中找到根节点的位置,根节点左边的所有节点就是树根左子树的构成,根节点右边的所有节点就是树根右子树的构成
  • 步骤3:使用中序序列的左子树部分,在后序序列中进行查找,在后序序列中最后出现的节点就是左子树的树根
  • 步骤4:使用中序序列的右子树部分,在后序序列中进行查找,在后序序列中最后出现的节点就是右子树的树根
  • 在确定左右子树的树根节点之后,重复上述步骤1-­5,直到后序序列和中序序列中的所有元素全部使用过为止,二叉树构建完成

通过后序序列和中序序列构建二叉树过程如图所示:

3、二叉树的镜像对称问题

为什么说在之给定先序序列和后序序列的情况下不能够唯一确定一个二叉树的结构呢?下面我们先来观察如下的两个二叉树结构,并对这两个二叉树结构分别推断先序、中序、后序遍历序列:

从上图中我们不难看出,两个二叉树的结构是不同的,但是两个二叉树的先序序列和后序序列是完全相同的,只有中序序列不同
我们称图中两个二叉树结构下BD两个节点的结构为镜像对称。所以,如果在两个二叉树结构中存在这种进行对称的结构,是不能够通过先序序列和后序序列进行区分的,只能够再通过一个中序序列加以区分。

数据结构(十二)二叉树—— 二叉树的逆推构建相关推荐

  1. 12_JavaScript数据结构与算法(十二)二叉树

    JavaScript 数据结构与算法(十二)二叉树 二叉树 二叉树的概念 如果树中的每一个节点最多只能由两个子节点,这样的树就称为二叉树: 二叉树的组成 二叉树可以为空,也就是没有节点: 若二叉树不为 ...

  2. C语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)

    关于二叉树的定义,网上有比较好的介绍,在这里就简单介绍二叉树的一些性质 二叉树的基本性质 1)二叉树的第i层上至多有 2^(i-1)(i ≥1)个结点: 2)深度为 h 的二叉树中至多含有 2^h – ...

  3. 数据结构(十二) -- 树(四) -- 霍夫曼树

    1. 基本介绍 给定n个权值为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也成为了霍夫曼树. 霍夫曼树是带权路径长度最短的树,权值较大的节点离根较 ...

  4. 数据结构(十二)动态规划

    1 递归函数建模 动态规划一般用于全局问题,在构造递归的时候,一般采用自顶向下分解的方法,先把全局问题分解成更小的子问题求解.下面举两个例子 例子1:有一座高度是10阶的楼梯,从下往上走,每跨一步可以 ...

  5. 三十二、电子商务服务推荐模型构建

    1. 模型构建 本案例在数据预预处理的基础上,针对预处理后的数据进行模型构建,其中涉及的过程主要有: 推荐流程 相似度计算 推荐结果 2. 推荐流程 2.1 推荐系统流程图 在实际应用中,构造推荐系统 ...

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

    二叉树的深度优先遍历逆推 二叉树的深度优先遍历有三种方式,分别叫做先序遍历(preorder).中序遍历(inorder)和后序遍历(postorder),它们之间的不同在于访问每个节点的次序不同. ...

  7. 数据结构c语言版二叉树的顺序存储表示,数据结构(十一) -- C语言版 -- 树 - 二叉树基本概念...

    内容预览 零.读前说明一.二叉树相关概念1.1.定义1.2.性质1.3.满二叉树与完全二叉树1.3.1.满二叉树1.3.2.完全二叉树1.3.3.特点延伸 二.二叉树储存结构2.1.顺序结构存储2.2 ...

  8. puzzle(1011)平面逆推:康斯逆推

    目录 一,康斯puzzle 二,康斯逆推 三,六边形康斯逆推 一,康斯puzzle 康斯是一家做平面逆推问题的出版商. 官网:点击打开链接 二,康斯逆推 最强大脑的康斯逆推,其实就是数图: 给出每行每 ...

  9. 数据结构(二十)二叉树的递归遍历算法

    一.二叉树的遍历的定义 1.二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问依次且仅被访问依次.树的结点之间不存在 ...

最新文章

  1. 图像特征检测(Image Feature Detection)
  2. python处理视频动漫化_用Python实现抖音上的“人像动漫化”特效,原来这么简单...
  3. Google App Engine 学习和实践
  4. docker下安装Nginx的方法
  5. 第七周实践项目3 负数把正数赶出队列
  6. Django常用命令总结(图片)
  7. Maya mayapy.exe 安装 Cython,编译 pyd
  8. LiveVideoStackCon2021音视频技术大会北京站开幕在即,精彩抢鲜看
  9. Okhttp同步请求源码分析
  10. java获取spring注解的实体_Spring 注解实体类中非数据库字段属性
  11. 终于有人把 Spring 循环依赖讲清楚了!
  12. delphi7 如何判定dbgrid两行重复_教你如何在服装上加入好看的毛线刺绣花边
  13. Qt学习笔记-简单的UDP广播包聊天室
  14. ViewDragHelper
  15. javamelody监控java项目_使用javamelody监控javaEE
  16. ubuntu安装流媒体服务器(nginx+rtmp,rtsp转rtmp,rtsp转m3u8)
  17. 自己动手写cpu pdf_教你自己动手组装电脑(第一篇:CPU)
  18. 非家用的监控摄像头都无复位功能
  19. 报童模型(2)--经济学含义和应用
  20. 完整的网站前端+源码模板

热门文章

  1. MySQL——IN的用法详解
  2. 外科手术器械设计 超声刀设计思路和原理 - 02
  3. python文本字符分析
  4. 201521123064 《Java程序设计》第7周学习总结
  5. sql语句练习题,答案
  6. 大数据系统开发综合实践(一)
  7. ROOT/RStringView.hxx:32:37: error: ‘experimental’ in namespace ‘std’ does not name a type
  8. MySQL索引数据结构二叉树、红黑树、B-Tree、B+Tree、Hash
  9. 傅里叶变换的相关公式
  10. flask-sqlalchemy一对多 知了传课 flask web全栈开发实战 黄勇