如何代码化?
总体代码如下:
讲一下它的思路:
这里有两个指针:
一个为指向当前访问结点的指针T、一个为指向当前访问结点T的前驱结点的指针pre;
例如:
T指向D时,pre指向B,指导循环结束指向D,然后T再离开D指向T->lchild和T->rchild
易错点一
脑中自行循环整个代码,直到最后一个结点处:
此时,T指向F,pre指向C,
F的左前驱是pre指向的C,
所以visit函数第一个if语句不满足不执行,
但是第二个if语句由于pre指向了C且C没有右子结点而满足条件被执行,
所以执行了C的后继线索是NULL,
最后pre也指向了T所指的F;
我们发现循环已经结束了,因为T已经没有可以向下遍历的结点了,循环到F就停止了,连pre这个“T的追随者”也跟上来了,那么这个最后的F结点的后继线索就没法跟刚才一样被循环过了(这里不能理解的话就回顾代码是怎么根据pre写后继线索的,必须要有一个pre的领路人T)
解决办法就是单独为最后的F写一个后继线索的实现代码:
易错点二
(此情况只发生在先序遍历)
我们在访问一个没有左子结点的结点T时,它的前继线索被指向了pre所指向的前驱结点,那么这个T被PreThread函数访问时会继续访问T->lchild,这时候T变成了pre,pre继续执行PreThread又会访问T这个没有左子结点的结点,就会形成“循环圈”
解决办法就是加一个判断语句:
只有这个被访问的这个结点的ltag值为0,即表示的是非线索指针的左子结点才会执行,否则直接执行右子结点:
所以当T现在指向D的时候,lchild指向了pre,ltag值从0变为1,所以直接PreThread(G),避免了循环: