线索二叉树产生的原因:首先是看到存储二叉树时有很多空指针没有用其实是若想知道某个节点的前驱后继必须还得遍历一遍太浪费了。于是想在一次遍历的过程存储上节点的前驱和后继,以后就不用再遍历了。因此存储二叉树的结构需要做一些改变(貌似到现在还没真正的建立一棵二叉树):
Lchild LTag Data RTag Rchild
表一:线索二叉树的节点结构
增加LTag和RTag的原因是,若是只有左右子树的指针时不知道指向的是孩子还是前驱或者后继,当LTag=0时Lchild指向的是左孩子,LTag=1时指向的是前驱。当RTag=0时Rchild指向的是右孩子,RTag=1时指向的是后继。
线索化的过程:在遍历二叉树的过程中将二叉链表中的空指针改为指向前驱或者后继的指针的过程。其实就是修改指针的过程。中序线索二叉树的具体的算法如下:
BiTree pre;//刚刚访问过的节点
void InThreading(BiTree p){
if(p!=null){
InThreading(p.Lchild);
if(p.Lchild==null){
p.LTag = 1;
p.Lchild = pre;
}
if(pre.Rchild==null){
pre.RTag = 1;
pre.Rchild = p;
}
pre = p;
InThreading(p.Rchild);
}
}
从算法的描述中可以看出其实就是将中序遍历二叉树的vist(p)改成了为p.LTag和p.RTag赋值的过程。