线索二叉树

线索二叉树产生的原因:首先是看到存储二叉树时有很多空指针没有用其实是若想知道某个节点的前驱后继必须还得遍历一遍太浪费了。于是想在一次遍历的过程存储上节点的前驱和后继,以后就不用再遍历了。因此存储二叉树的结构需要做一些改变(貌似到现在还没真正的建立一棵二叉树):

LchildLTagDataRTagRchild

                                                                                                                        表一:线索二叉树的节点结构

增加LTag和RTag的原因是,若是只有左右子树的指针时不知道指向的是孩子还是前驱或者后继,当LTag=0时Lchild指向的是左孩子,LTag=1时指向的是前驱。当RTag=0时Rchild指向的是右孩子,RTag=1时指向的是后继。

线索化的过程:在遍历二叉树的过程中将二叉链表中的空指针改为指向前驱或者后继的指针的过程。其实就是修改指针的过程。中序线索二叉树的具体的算法如下:

BiTree pre;//刚刚访问过的节点
void InThreading(BiTree p){
        if(p!=null){
            InThreading(p.Lchild);
             if(p.Lchild==null){
                 p.LTag = 1;
                 p.Lchild = pre;
             }

              if(pre.Rchild==null){
                   pre.RTag = 1;
                    pre.Rchild = p;
               }
        pre = p;
        InThreading(p.Rchild);
        }
}
从算法的描述中可以看出其实就是将中序遍历二叉树的vist(p)改成了为p.LTag和p.RTag赋值的过程。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值