120 lines
2.9 KiB
Markdown
120 lines
2.9 KiB
Markdown
---
|
||
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>
|