Skip to content

2012年 408 数据结构 第 3 题

数据结构2012年选择题2分

题目

若一棵二叉树的前序遍历序列为 a, e, b, d, c,后序遍历序列为 b, c, d, e, a,则根结点的孩子结点( )。

错因

B

误以为根 a 有两个孩子 eb。判断方法弄反了:前序去根后是 e, b, d, c前序首 e 是 a 的某个孩子——但选 B 的人可能直接把 eb 都当成 a 的直接孩子,没意识到 b 实际是 e 子树里的节点。

C

类似 B 的错误。把后序的某个节点(如 c)误当成 a 的孩子。其实后序末尾是根 a,倒数第二个 e 才是 a 的某子树根;c 在后序更靠前,在某更深层子树里。

D

完全否定可解性。事实上"前序 + 后序不能唯一确定二叉树"的局限在于单孩子节点的左右无法区分,但"根有几个孩子、是哪个节点"这个层级的信息是可以确定的。直接给 D 等于放弃分析。

总解析

关键性质:前序遍历是 NLR(根→左→右),后序遍历是 LRN(左→右→根)。

  • 前序首 = 根 → 题目里前序首 a 是根 ✓
  • 后序末 = 根 → 题目里后序末 a 也是根 ✓

判断 a 有几个孩子

去掉根 a 后,剩余节点要么全在左子树,要么全在右子树("a 只有一个孩子"),要么分成两段("a 有两个孩子"):

  • 前序去根:e, b, d, c
  • 后序去根:b, c, d, e

如果 a 有左右两个子树:

  • 左子树前序首 = 左子树根 =
  • 右子树后序末 = 右子树根 =
  • (因为是两棵不同子树的根)

但本题里前序首是 e、后序末也是 e——根的孩子前序首 = 后序末 = e,所以 a 只有一个孩子,就是 e。其余 b, d, c 全是 e 子树里的节点。

进一步分析 e 的子树(前序 e,b,d,c + 后序 b,c,d,e):去 e 后前首 b ≠ 后末 d,说明 e 有两个孩子(b 是左子树根,d 是右子树根)。但 a → e 这条边到底是左还是右?前序+后序无法分辨单孩子的左右,这就是这两种遍历组合不能唯一重建二叉树的根源。

最终答案是 A(根 a 只有一个孩子 e)。

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数