线索二叉树

原创 2016年05月31日 14:34:06
        普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。 
        若将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快“顺藤摸瓜”而遍历整个树了。
例如中序遍历结果: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,先左再根再右)






版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)