Appearance
题目
若对如下的二叉树进行中序线索化,则结点 x 的左、右线索指向的结点分别是( )。
错因
A
把"x 的中序前驱"误判为 e、把"x 的中序后继"误判为 c。
中序遍历该树的真实序列是 d, e, b, x, a, c——e 在 b 之前,和 x 之间还隔着 b,所以 e 不是 x 的直接前驱;c 是序列尾,和 x 之间还隔着 a,也不是 x 的直接后继。选 A 的人把"中序序列里跨过去的元素"当成了直接邻居。
B
前驱写成 e,错点同 A——漏看了 b 在 e 和 x 之间。
后继 a 倒是对的,但前驱错就整体错。
C
前驱 b 对,但后继误写成 c。
错在以为"x 没有右子树 → 父亲 b 在 x 之前已经被访问 → 后继跳到 x 的祖辈或更外层",没具体走中序序列。中序遍历父子树访问完毕后回到祖父 a,a 才是 x 的下一个被访问的节点;c 在 a 之后,不是直接后继。
总解析
中序线索化的定义:每个节点的左指针指向中序前驱(如果该节点没有左孩子)、右指针指向中序后继(如果该节点没有右孩子)。x 是叶子,没有左右孩子 → 左右指针都是线索。
第一步:写出中序遍历序列。
中序遍历 = 左子树 → 根 → 右子树。从树根 a 开始:
访问 a 之前:先递归 a 的左子树 b
访问 b 之前:先递归 b 的左子树 d
访问 d 之前:d 无左子树 → 访问 d
访问 d 之后:递归 d 的右子树 e
e 无左子树 → 访问 e
访问 b
访问 b 之后:递归 b 的右子树 x
x 无左子树 → 访问 x
访问 a
访问 a 之后:递归 a 的右子树 c
c 无左子树 → 访问 c中序序列:
第二步:找 x 的前驱和后继。
序列中,x 的左邻是 b、右邻是 a。
- x 的中序前驱 =
b→ x 的左线索指向 b - x 的中序后继 =
a→ x 的右线索指向 a
几何直觉的快捷判断(不画序列也能算):
- 找前驱:x 没有左子树 → 沿父链向上找"第一个把 x 当成右子树后代的祖先",那个祖先就是前驱。x 的父亲 b 满足"x 在它的右子树里",所以前驱是 b。
- 找后继:x 没有右子树 → 沿父链向上找"第一个把 x 当成左子树后代的祖先"。x 的父亲 b 不满足(x 是 b 的右孩子),继续往上:a 把 b 当成左子树,而 x 在 b 的右子树里 → x 在 a 的左子树里,所以后继是 a。
最终答案是 D(b、a)。