Skip to content

2014年 408 数据结构 第 4 题

数据结构2014年选择题2分

题目

若对如下的二叉树进行中序线索化,则结点 x 的左、右线索指向的结点分别是( )。

abdexc

错因

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 的祖辈或更外层",没具体走中序序列。中序遍历父子树访问完毕后回到祖父 aa 才是 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)

最后更新:

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

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