--- 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]` ``` 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] 记忆口诀 > - 前序找根(第一个就是根) > - 中序分两边(根左边是左子树,右边是右子树) > - 后序最后根(根在最后出现)