Files
leetcode-go/笔试/微派 Test1/04-单选题2-后序遍历.md
T

120 lines
2.9 KiB
Markdown
Raw Normal View History

2026-05-16 14:15:58 +08:00
---
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]` |
<details>
<summary>点击查看答案与解析</summary>
### ✅ 正确答案:**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]`
```
A
/ \
B ?
/ \
D E
```
**第三步**:分解右子树
- 前序中右子树部分 = `[C, F]`
- 右子树的前序第一个 = `C` → **右子树的根是 C**
- 在中序 `[C, F]` 中找到 C:
- C 的左子树: `[]`(空)
- C 的右子树: `[F]`
```
A
/ \
B C
/ \ \
D E F
```
**第四步**:写出后序遍历(左 → 右 → 根)
```mermaid
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] 记忆口诀
> - 前序找根(第一个就是根)
> - 中序分两边(根左边是左子树,右边是右子树)
> - 后序最后根(根在最后出现)
</details>