2.9 KiB
2.9 KiB
tags, create time
| tags | create time | |||||
|---|---|---|---|---|---|---|
|
2026-05-16 14:50 |
04 - 单选题 2:二叉树后序遍历
题目
已知一棵二叉树的前序遍历为 [A, B, D, E, C, F],中序遍历为 [D, B, E, A, C, F]。则该树的后序遍历为:
| 选项 | 内容 |
|---|---|
| A | [D, E, B, F, C, A] |
| B | [D, B, E, F, C, A] |
| C | [E, D, B, F, C, A] |
| D | [D, E, B, C, F, A] |
点击查看答案与解析
✅ 正确答案:A
详细解析
解题思路
通过前序和中序遍历重建二叉树,然后手动推导后序遍历。
核心性质:
- 前序:
根 → 左子树 → 右子树 - 中序:
左子树 → 根 → 右子树 - 后序:
左子树 → 右子树 → 根
逐步重建
第一步:确定整棵树的根
- 前序第一个 =
A→ 根节点是 A - 在中序中找到 A:
[D, B, E, | A, C, F]- 左子树(中序):
[D, B, E] - 右子树(中序):
[C, F]
- 左子树(中序):
A
/ \
[D,B,E] [C,F]
第二步:分解左子树
- 前序中去掉根 A,剩余
[B, D, E, C, F] - 左子树长度 = 3,所以前序中左子树部分 =
[B, D, E] - 左子树的前序第一个 =
B→ 左子树的根是 B - 在中序
[D, B, E]中找到 B:- B 的左子树(中序):
[D] - B 的右子树(中序):
[E]
- B 的左子树(中序):
A
/ \
B ?
/ \
D E
第三步:分解右子树
- 前序中右子树部分 =
[C, F] - 右子树的前序第一个 =
C→ 右子树的根是 C - 在中序
[C, F]中找到 C:- C 的左子树:
[](空) - C 的右子树:
[F]
- C 的左子树:
A
/ \
B C
/ \ \
D E F
第四步:写出后序遍历(左 → 右 → 根)
flowchart TD
subgraph LR["后序遍历时序"]
S1["① D (B的左)"] --> S2["② E (B的右)"]
S2 --> S3["③ B (左子树根)"]
S3 --> S4["④ F (C的右)"]
S4 --> S5["⑤ C (右子树根)"]
S5 --> S6["⑥ A (整树根)"]
end
后序结果: [D, E, B, F, C, A]
快速验证
检查每个选项的后序特点:
- 后序最后一个元素一定是根节点 A → 所有选项都满足 ✓
- 对于 B 的子树,D 和 E 应该是 B 的子节点,在后续中应在 B 之前出现
- D 和 E 无子关系(单节点),可以任意顺序出现在 B 前 →
D, E正确
面试延伸题
[!question] 如果只给后序+中序?能唯一确定二叉树吗?
可以! 原理类似:后序的最后一个元素是根,从中序划分左右子树,再递归处理。
只有前序+后序不能唯一确定二叉树(除非是满二叉树)。
[!tip] 记忆口诀
- 前序找根(第一个就是根)
- 中序分两边(根左边是左子树,右边是右子树)
- 后序最后根(根在最后出现)