线索二叉树的概念
对于具有n个结点的二叉树,采用二叉链存储结构时,每个结点有两个指针域,总共有2n个指针域,又由于只有n-1个结点被有效指针所指向(n个结点中只有树根结点没有被有效指针域所指向),则共有2n-(n-1)=n+1个空链域。中序遍历二叉树的结果是一个结点的线性有序序列。可以利用这些空链域存放指向结点的前驱和后继结点的指针。这样的指向该线性序列中的“前驱”和“后继”的指针,称作“线索”。
在结点的存储结构上增加两个标志位来区分这两种情况:
这样,每个结点的存储结构如下:
按上述原则在二叉树的每个结点上加上线索的二叉树称作线索二叉树。对二叉树以某种方式遍历使其变为线索二叉树的过程称作按该方式对二叉树进行线索化。线索二叉树是一种物理结构。
好处
二叉树进行中序遍历时,不再需要使用递归和堆栈。
敲黑板
二叉树的线索化分为三种,分别是先序、中序、后序线索化。在进行线索化时,每个结点的左孩子和右孩子很容易看,容易线索化,注意其中没有左孩子或者右孩子的结点,它的前驱或后继是按照你的线索化的类型的序列。下面举个栗子会附加一点分析。
举个栗子栗子
其中,实线用于结点的孩子,虚线用于结点的前后驱。按照给出的左图容易画出实线,标上数字0,剩下的标1。D结点的lchild没有,指向其前驱结点,按照先序遍历的序列:ABDEGCF,其前驱结点是B,所以虚线指向B。以此类推。
自己试试吧。
二叉树的线索化算法(以中序线索二叉树为例)
建立线索二叉树,或者说对二叉树进行线索化,其实就是遍历一棵二叉树的同时进行操作。另外,在对一棵二叉树进行线索化时,必须先申请一个头结点,建立头结点与二叉树的根结点的指向关系,对二叉树进行线索化后,还需建立最后一个结点与头结点之间的联系。
其中,p总是指向当前被线索化的结点,pre指向访问过的结点。pre是p的前驱结点,p是pre的后继结点。