具有n个结点的二叉链表中,有n+1个空指针。
将二叉链表中的空指针域利用起来,指向其前驱结点和后继结点。
1.定义
线索:将二叉链表中的空指针域指向前驱结点和后继结点的指针被称为线索。
线索化:使二叉链表中结点的空链域存放其前驱或后继信息的过程称为线索化;
线索链表:加上线索的二叉链表称为线索链表(或线索二叉树)
2.分类
二叉树的遍历方式有4种,故有4种意义下的前驱和后继,相应的有4种线索二叉树:
1. 前序线索二叉树
2. 中序线索二叉树
3. 后序线索二叉树
4. 层序线索二叉树
3.创建
以中序线索二叉树为例讲解线索二叉树的创建。
中序线索二叉树的创建
1.二叉树的中序序列为:D G B A E C F
2.将二叉树线索化,空的左指针指向前驱结点,空的右指针指向后继结点
上图中:
G的左空指针指向其前驱结点D,右空指针指向其后继结点B
B的右空指针指向其后继结点A
E的左空指针指向其前驱结点A,右空指针指向其后继结点C
F的左空指针指向其前驱结点C,右空指针指向其后继结点空
这样就很方便找到中序序列的前驱和后继了。
线索化的具体过程就是在二叉树的遍历中修改空指针。
线索化具体实现
1.结点结构的改变
如果只是在原二叉树的基础上利用空结点,那么就存在着这么一个问题:我们如何知道某一结点的lchild是指向他的左孩子还是指向前驱结点?rchild是指向右孩子还是后继结点?显然我们要对他的指向增设标志来加以区分。
因此,我们在每一个结点都增设两个标志域Itag和rtag,它们只存放0或1的布尔型变量,占用的空间很小。于是结点的结构如图所示。
2.建立过程
我们设置
p指针,指向正在访问的结点
pre指针,永远指向遍历当前结点的前一个结点即p指针之前访问的节结点。
-
建立二叉链表,将每个结点的左右标志设置为0;
-
遍历二叉链表,建立线索;
2.1如果二叉链表p为空,则空操作返回;
2.2对P的左子树建立线索;
2.3对根结点p建立线索;- 若p没有左孩子,则为p加上前驱线索即Itag=1以及把左孩子的指针Ichild指向pre(相对当前结点的前驱结点)。
- 若pre没有右孩子,则为pre加上后继线索即rtag=1以及把pre右孩子的指针rchild指向当前结点p(p相对pre结点为后继结点)。
- 把当前结点赋给pre,完成后续的递归遍历线索化。p指针按照中序遍历的过程不断移动
2.4对P的右子树建立线索;