线索二叉树

        普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。 
        若将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快“顺藤摸瓜”而遍历整个树了。
例如中序遍历结果:B D C E A F H G,实际上已将二叉树转为线性排列,显然具有唯一前驱和唯一后继。

1. 线索二叉树的定义
规定:
         1)若结点有左子树,则lchild指向其左孩子;否则, lchild指向其直接前驱(即线索);
         2)若结点有右子树,则rchild指向其右孩子;否则, rchild指向其直接后继(即线索) 。

为区别两种不同情况,特增加两个标志域(各1bit)
约定:
         当Tag域为0时,表示正常情况;
         当Tag域为1时,表示线索情况.
有关线索二叉树的几个术语:
        线索链表:用含Tag的结点样式所构成的二叉链表         
        线   索:指向结点前驱和后继的指针 
        线索二叉树:加上线索的二叉树  
        线    索   化:对二叉树以某种次序遍历使其变为线索二叉树的过程 
增加了前驱和后继等线索有什么好处? ——能方便找出当前结点的前驱和后继,不用堆栈也能遍历整个树。

线索二叉树的生成:
        线索化过程就是在遍历过程中修改空指针的过程: 将空的lchild改为结点的直接前驱; 将空的rchild改为结点的直接后继。
非空指针仍然指向孩子结点(称为“正常情况”)

线索二叉树的生成算法:
        目的:在依某种顺序遍历二叉树时修改空指针,添加前驱或后继。 
        注解:为方便添加结点的前驱或后继,需要设置两个指针:p指针→当前结点之指针;  pre指针→前驱结点之指针。
        技巧:当结点p的左、右域均空时,只改写它的左域(装入前驱pre),而其右域(后继)留给下一结点来填写。或者说,当前结点的指针p应当送到前驱结点的空右域中。 
         若p->lchild=NULL,则{p->Ltag=1;p->lchild=pre;}//p的前驱结点指针pre存入左空域 
        若pre->rchild=NULL, 则{pre->Rtag=1;pre->rchild=p;} //p存入其前驱结点pre的右空域


线索二叉树的遍历
         理论上,只要找到序列中的第一个结点,然后依次访问结点的后继直到后继为空时结束。
         但是,在线索化二叉树中,并不是每个结点都能直接找到其后继的,当标志为0时,R_child=右孩子地址指针,并非后继!需要通过一定运算才能找到它的后继。
         以中序线索二叉树为例: 对叶子结点(RTag=1),直接后继指针就在其rchild域内; 对其他结点(RTag=0),直接后继是其右子树最左下的结点; (因为中序遍历规则是LDR,先左再根再右)






  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值