Skip to content

2024年 408 数据结构 第 3 题

数据结构2024年选择题2分

题目

p、q、v 都是二叉树 T 中的结点,二叉树 T 的中序遍历为 ···, p,v,q,··· ,其中 v 有两个孩子结点,则下列说法正确的是( )。

错因

B

抓住了"p 没右孩子"这一半,但没意识到对 q 是对称的:q 是 v 的中序后继,必然是 v 右子树中最左下那个结点,因此 q 也不能有左孩子——否则 q 的左孩子会比 q 先被访问,会插在 v 和 q 之间,p,v,q 就不再连续了。

C

把 p 当成 v 的"中序后继"或者把"前驱"想成了普通的父子关系。p 是 v 的中序前驱,按"左根右"的访问顺序,p 必须是 v 左子树中最右下的结点;如果 p 还有右孩子 p′,那么 p 之后会先去访问 p′ 子树,p′ 就会插在 p 和 v 之间,与"中序中 p 紧挨 v"矛盾。

D

同时踩了 B、C 两种错。可能是把题目当成"v 的两个孩子分别是 p 和 q"——那种关系下确实可以两个都有孩子,但本题说的是中序序列里的紧邻三元组 p, v, q,前驱后继的位置约束严格得多。

总解析

关键性质:在二叉树中序遍历"左 → 根 → 右"下,对一个有两个孩子的结点 v:

  • v 的中序前驱 = v 的左子树里"沿右孩子一路向下到底"的结点 → 这个结点必然没有右孩子
  • v 的中序后继 = v 的右子树里"沿左孩子一路向下到底"的结点 → 这个结点必然没有左孩子

为什么?以前驱为例:中序访问完 v 的整棵左子树后才轮到 v,左子树里最后被访问的那个结点就是 v 的前驱。中序"左根右"里最后一个访问的永远是当前子树的"右脚",即沿着右孩子链走到底的那个叶端;如果它还有右孩子,遍历就还没结束,它就不是"最后一个"。后继同理(对称)。

代入本题:

  • p 是 v 的前驱 ⇒ p 没有右孩子
  • q 是 v 的后继 ⇒ q 没有左孩子

注意:p 可以有左孩子,q 可以有右孩子——这一边的子树会被夹在更外层的访问序列里,不影响 p, v, q 三者紧邻。

最终答案是 A

最后更新:

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

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