Appearance
题目
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。