408考研逐题详解:2010年第3题——后序线索二叉树
2010年第3题
下列线索二叉树中(用虚线表示线索),符合后序线索树定义的是( )
解析
本题主要考查线索二叉树及其后序遍历的有关知识。
-
线索二叉树:线索二叉树是对普通二叉树的优化,通过利用空指针(nill 指针)存储“线索”(threads),指向遍历顺序中的前驱或后继结点。这样可以在不使用递归或栈的情况下高效实现遍历。
-
为什么使用线索:普通二叉树遍历(如中序、后序)需要 O ( n ) O(n) O(n) 空间复杂度(栈深度),而线索化后,遍历可降至 O ( 1 ) O(1) O(1) 空间复杂度(仅需指针移动)。
-
线索的的表示:
- 每个结点有两个指针(left 和 right)和两个标志位(ltag 和 rtag)。
- 若 ltag = 0,left 指针指向左孩子;若 ltag = 1,left 指针为线索,指向前驱结点。
- 若 rtag = 0,right 指针指向右孩子;若 rtag = 1,right 指针为线索,指向后继结点。
- 每个结点有两个指针(left 和 right)和两个标志位(ltag 和 rtag)。
-
线索化的目的:减少遍历时的空间开销,并支持快速查找前驱/后继。
-
-
后序线索树:线索的设置严格遵循后序遍历顺序。具体规则:
- 如果结点的左孩子为空,则其左指针(ltag=1)应指向其后序前驱结点。
- 如果结点的右孩子为空,则其右指针(rtag=1)应指向其后序后继结点。
- 如果结点有左/右孩子,则指针(ltag=0 或 rtag=0)必须指向孩子,不能设置线索。
- 结点处理:
- 后序序列的第一个结点(最左叶结点):没有前驱,因此左线索应为 null 或指向一个虚拟头结点(如果树有头结点)。
- 后序序列的最后一个结点(根结点):没有后继,因此右线索应为 null 或指向虚拟头结点。
- 其他结点:线索必须精确指向后序序列中的前一个或后一个结点。
根据上述知识,观察题目选项中的二叉树,对其进行后续遍历,得到的结点序列为:d、b、c、a。
- 结点 d 是后序序列的第一个结点,它没有前驱,左线索应为 null;结点 d 的后继是结点 b,所以其右指针指向后继结点 b。
- 结点 b 没有左孩子,所以其左指针指向其前驱结点 d。
- 结点 c 没有左孩子,其左指针指向其前驱结点 b;亦没有右孩子,其右指针指向其后继结点 a。
- 结点 a 有左右孩子,两个指针不保存线索。
对照各选项中虚线所示,可知 D 图符合后续线索二叉树定义。
本题答案:D