二叉树的线索化 的 代码实现 【数据结构 王道 学习随记】

如何代码化?

总体代码如下:

在这里插入图片描述

讲一下它的思路:

这里有两个指针:
一个为指向当前访问结点的指针T、一个为指向当前访问结点T的前驱结点的指针pre;

例如:

T指向D时,pre指向B,指导循环结束指向D,然后T再离开D指向T->lchild和T->rchildT指向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),避免了循环:
T指向D时,pre指向B,指导循环结束指向D,然后T再离开D指向T->lchild和T->rchild

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值