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

120 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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>