一、线索二叉树概述
在二叉树的节点上加上线索的二叉树称为线索二叉树。对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。
通过考察各种二叉链表,不管二叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n 个节点的二叉链表共有 2n 个链域,其中非空链域为 n-1 个,但空链域却有 n+1 个。如下图所示,二叉树有 6 个节点,其中非空链域的个数为 7 个。
利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
上图的二叉树的中序遍历结果是 {8, 3, 10, 1, 14, 6},但是 8, 10, 14, 6 这四个节点的左右指针并没有完全利用上。其实我们可以利用它们的左右指针,让各个节点可以指向自己的前后节点。如下图所示就是原二叉树线索化后生成的中序线索二叉树。
【注意】
当线索化二叉树后,节点的属性 left
和 right
,有如下情况:
left
可能指向的是左子树,也可能是指向的前驱节点。比如 ① 节点的left
指向的是左子树,而 ⑩ 节点的left
指向的就是它的前驱节点;right
可能指向的是右子树,也可能是指向后继节点。比如 ① 节点的right
指向的是右子树,而 ⑩ 节点的right
指向的是它的后继节点。
二、线索化二叉树实现
中序线索化二叉树代码实现如下:
public class No3_ThreadedBinaryTree {
public static void main(String[] args) {
// 构造结点用于测试
NumNode node_1 = new NumNode(1);
NumNode node_2 = new NumNode(3);
NumNode node_3 = new NumNode(6);
NumNode node_4 = new NumNode