线索二叉树

线索二叉树本质就是按一定规则将二叉树中结点排列成一个线性序列(对一个非线性结构进行线性操作)。
由于在线索链表中添加了遍历中得到的"前驱"和"后继"信息从而简化了遍历算法。
for(p=firstNode(T);p;p=Succ(p))
Visit(p);
关键是如何找第一个结点和后继。线索二叉树_第1张图片

算法如下:

线索二叉树_第2张图片
注意二叉链表和三叉链表都没头结点,线索二叉树有一个头结点。
P=T->lchild 指向头结点说明是有头结点。看下面中序遍历的线索二叉树图就知道了。

线索二叉树_第3张图片
1. 这也是为什么第二个while 循环里 P->rchild!=T因为在中序遍历下,最后一个节点rchild 指向头结点了。
2. while(p->rTag==thread&&P->rchild!=T)如果rTag 为htread ,后面p->rchild 不在是指向右孩子而是指向后继,不要被rchild 干扰。
3.为什么加头结点,中序遍历线索链表 第一个结点左指针域一定为空,最后一个结点右指针域一定为空(不管从孩子角度考虑还是从线索角度)。
线索二叉树的生成(本质就是遍历+visit()函数细化):
看如下中序二叉链表本质就是中序遍历二叉树visit函数细化。已经中序遍历算法里visit()改成暗红色块代码了。 if(!p->lchild){......}if(!pre->rchild){......}。
注意利用二叉树数据结构的好多算法都是在遍历基础上对visit()函数细化的过程
线索二叉树_第4张图片

你可能感兴趣的:(数据结构,算法)