二叉树的遍历运算是将二叉树中结点按一定规律线性化的过程。
当以二叉链表作为存储结构时,只能找到结点的左、右孩子信息,而不能直接得到结点在遍历序列(前、中、后序)中的前驱和后继信息。
要得到这些信息可采用以下两种方法:
第一种方法是将二叉树遍历一遍,在遍历过程中便可得到结点的前驱和后继,但这种方法浪费时间。
第二种方法是充分利用二叉链表中的空链域,将遍历过程中结点的前后继信息保存下来。
下面重点讨论第二种方法。
我们知道,在有n个结点的二叉链表中共有2n个链域,但只有n-1个有用的非空链域,其余n+1个链域是空的。可以利用剩下的n+1个空链域来存放遍历过程中结点的前驱和后继信息。
现作如下规定:
若结点有左子树,则其Left域指向其左孩子,否则Left域指向其前驱;
若结点有右子树,则其Right域指向其右孩子,否则Right域指向其后继;
为了区分孩子结点和前驱、后继结点,为结点结构增设两个标志域:Lflag、Rflag。
在这种结构中,指向前驱和后继结点的指针叫做线索。以这种结构组成的二叉链表作为二叉树的存储结构,叫做线索链表。对二叉树以某种次序(前、中、后序)进行遍历并且加上线索的过程叫做线索化。线索化了的二叉树称为线索二叉树。
线索化实质上是将二叉链表中的空指针域填上相应结点的遍历前驱或后继结点的地址,而前驱和后继的地址只能在遍历的过程中才能得到。因此线索化的过程即为在遍历过程中修改空指针域的过程。对二叉树按照不同的遍历次序(前、中、后序)进行线索化,可以得到不同的线索二叉树,这其中包括先序线索二叉树、中序线索二叉树和后序线索二叉树。如下图所示。