408数据结构第5章:二叉树遍历序列题——技巧、判断与真题型总结

适用:考研408数据结构

章节:第5章 树与二叉树

重点题型:

  1. 已知两种遍历,求第三种遍历

  2. 判断一棵二叉树能否唯一确定

  3. 已知前序和后序,判断中序可能/不可能

  4. 判断"前序与后序互逆"时二叉树的结构性质


一、先把三种遍历顺序记死

复制代码
前序:根 -> 左 -> 右

中序:左 -> 根 -> 右

后序:左 -> 右 -> 根

最重要的两个定位:

复制代码
前序第一个结点 = 根

后序最后一个结点 = 根

而中序的作用是:

复制代码
用根结点把序列切成左子树和右子树

所以这类题最核心的一句话是:

复制代码
前序/后序负责找根,中序负责切左右。

二、哪两种遍历能唯一确定二叉树

这是408非常常见的概念题。

已知遍历 是否一般能唯一确定二叉树
前序 + 中序
后序 + 中序
前序 + 后序 一般不能

原因很简单。

如果有中序,一旦知道根,就能立刻知道:

复制代码
根左边 = 左子树
根右边 = 右子树

但只有前序和后序时,如果某个结点只有一个孩子,就无法判断这个孩子究竟是:

复制代码
左孩子
还是
右孩子

所以:

复制代码
有中序,基本能还原;
没中序,一般不唯一。

三、题型1:已知前序 + 中序,求后序

例如:

复制代码
中序:ABCD
前序:CABD

要求后序。

解题过程

前序第一个结点一定是根,所以根为:

复制代码
C

在中序序列中找到 C:

复制代码
AB | C | D

因此:

复制代码
左子树:AB
右子树:D

左子树有2个结点,所以从前序去掉根 C 后:

复制代码
左子树前序:AB
右子树前序:D

继续看左子树:

复制代码
前序:AB
中序:AB

前序第一个 A 是根。

在中序中:

复制代码
A | B

说明 A 没有左孩子,B 是 A 的右孩子。

整棵树为:

复制代码
    C
   / \
  A   D
   \
    B

按照后序:

复制代码
左 -> 右 -> 根

左子树后序:

复制代码
BA

右子树:

复制代码
D

最后访问根 C:

复制代码
BADC

所以:

复制代码
后序 = BADC

四、已知前序 + 中序的固定模板

以后不需要重新想,直接按这个流程:

复制代码
1. 前序第一个元素找根

2. 在中序中找到根

3. 中序按根切成:
   左子树 | 根 | 右子树

4. 根据左右子树结点数量
   去切前序序列

5. 对左右子树重复上述过程

6. 最后按题目要求写出后序

五、题型2:已知后序 + 中序,求前序

方法完全类似,只改一个地方:

复制代码
后序最后一个元素 = 根

然后仍然使用中序:

复制代码
左子树 | 根 | 右子树

去切分。

所以记忆:

复制代码
前序找第一个根
后序找最后一个根
中序负责切左右

六、题型3:前序 + 后序,判断中序是否可能

例如:

复制代码
前序:ABCD
后序:DCBA

这时候不能直接说"可以唯一还原"。

因为:

复制代码
前序 + 后序 一般不能唯一确定二叉树

但我们可以根据它们判断树的大致结构。

前序:

复制代码
A B C D

后序:

复制代码
D C B A

二者正好互为逆序,这说明整棵树实际上退化成了一条链:

复制代码
A
|
B
|
C
|
D

但是每一条边到底向左还是向右并不唯一。

例如:

复制代码
A
 \
  B
   \
    C
     \
      D

可以。

下面这样也可以:

复制代码
    A
   /
  B
 /
C
/
D

甚至左右可以混合。

所以:

复制代码
前序 + 后序确定的是"结点先后关系",
但不一定确定每个单孩子结点的左右方向。

七、怎么判断中序序列可能/不可能

继续以上例:

复制代码
前序:ABCD
后序:DCBA

可能出现的中序并不是任意排列。

对于这棵单链树,每一个结点只有一个孩子。

如果孩子是左孩子:

复制代码
中序 = 子树 + 根

如果孩子是右孩子:

复制代码
中序 = 根 + 子树

所以可以递归地产生合法中序。

例如可能出现:

复制代码
ABCD
BCDA
DCBA
CDBA

但:

复制代码
CBDA

无法通过这种"单链左右选择"产生,因此不可能。

这类题的技巧是:

复制代码
前序+后序若互逆
-> 先判断为单链结构
-> 再逐项验证中序是否能由"左挂/右挂"得到

八、题型4:前序和后序正好相反,树满足什么条件

这是性质判断题。

若:

复制代码
前序:A B C D
后序:D C B A

则说明每个结点至多只有一个孩子。

因为只要某个结点同时拥有左、右两个孩子,前序和后序中左右子树的整体顺序关系就不可能完全互逆。

所以这种树会退化成一条链。

如果共有 n 个结点:

复制代码
树高 = n

因此遇到题目:

复制代码
若二叉树前序遍历和后序遍历正好相反,
则该树满足什么条件?

优先想到:

复制代码
退化成单链
-> 高度 = 结点数

注意:

复制代码
不能说"所有结点都没有左孩子"
也不能说"所有结点都没有右孩子"

因为链既可以向左,也可以向右,还可能左右混合。


九、为什么"前序 + 后序"一般不能唯一确定

看最简单的例子:

复制代码
前序:AB
后序:BA

可能是:

复制代码
  A
 /
B

也可能是:

复制代码
A
 \
  B

两棵树:

复制代码
前序都为 AB
后序都为 BA

所以不能唯一确定。

真正缺少的信息就是:

复制代码
B 是左孩子还是右孩子?

这也是所有"前序+后序不唯一"问题的本质。


十、考试中最常见的三类题

1. 已知前序 + 中序,求后序

固定:

复制代码
前序找根
中序切分
递归

2. 已知后序 + 中序,求前序

固定:

复制代码
后序最后找根
中序切分
递归

3. 已知前序 + 后序,判断可能性

第一反应:

复制代码
一般不能唯一确定

然后再看题目是否有特殊条件。

例如:

复制代码
前序和后序互逆

马上联想到:

复制代码
单链树
高度 = 结点数

十一、选择题秒杀技巧

技巧1:有中序,先切

不要先画整棵树。

先写:

复制代码
左子树 | 根 | 右子树

很多题直接就出来了。


技巧2:前序看头,后序看尾

复制代码
前序第一个 = 根
后序最后一个 = 根

这是最稳定的定位方法。


技巧3:前序 + 后序先判断"不唯一"

除非题目额外给条件,否则:

复制代码
前序 + 后序

不要直接唯一还原。


技巧4:前后互逆,先想"链"

看到:

复制代码
前序:ABCD...
后序:...DCBA

先想到:

复制代码
每个结点最多一个孩子

也就是:

复制代码
树退化成链

十二、常见错误

错误1:把中序的第一个结点当根

错误。

中序不能直接确定根。

只有先知道根是谁,才能利用中序切左右。


错误2:看到前序+后序就开始唯一画树

错误。

复制代码
前序+后序一般不唯一

错误3:前后互逆就认为只能全左或全右

错误。

左右方向可以混合。

真正确定的是:

复制代码
每个结点至多只有一个孩子

错误4:切序列时只看字符,不看子树结点数量

例如中序切出:

复制代码
左子树有3个结点

那么去切前序/后序时也必须严格取3个结点。


十三、考场统一流程

遇到遍历序列题,先问三个问题:

复制代码
1. 根是谁?

2. 能不能利用中序切左右?

3. 这两种遍历能不能唯一确定?

然后分类:

复制代码
前序+中序
-> 前序找根,中序切分

后序+中序
-> 后序找根,中序切分

前序+后序
-> 一般不唯一
-> 再根据题目额外条件判断

十四、10秒速记

复制代码
前序:根左右
中序:左根右
后序:左右根

前序第一个是根
后序最后一个是根

前+中:唯一
后+中:唯一
前+后:一般不唯一

前后互逆:
树退化成链
高度 = 结点数

十五、最后只背三句话

复制代码
先找根;

有中序就切分;

没中序一般不唯一。

这三句话基本覆盖408中绝大多数二叉树遍历序列选择题。

相关推荐
Forever Nore3 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
旖旎夜光6 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
不一样的故事1268 小时前
芯片设计是一个高度复杂、分工精细的系统工程
数据结构·经验分享
梁辰兴9 小时前
软件工程:面向数据结构的设计方法
数据结构·软件工程·梁辰兴·面向数据结构的设计方法·jackson方法·warnier方法·方法比较
白狐_7989 小时前
408数据结构第7章:查找②——顺序、折半、分块查找秒杀 + 真题
数据结构·算法
hold?fish:palm10 小时前
链表的基本原理和实现(C++版本)
数据结构·c++·链表
码完就睡11 小时前
数据结构——树、二叉树基础概念
数据结构·算法
疯狂打码的少年12 小时前
【数据结构】栈:定义、顺序栈与链式栈
数据结构·笔记
wabs66613 小时前
关于图论【最短路径之Bellman_ford 算法|卡码网94.城市间货物运输的思考】
数据结构·算法·图论·卡码网·bellman_ford·求最短路径