线索二叉树(下)

中序线索二叉树的遍历

        中序线索二叉树的结点中隐含了线索二叉树的前驱和后继信息。在对其进行遍历时,只要先找到序列中的第一个结点,然后依次找结点的后继,直至其后继为空。在中序线索二叉树中找结点的后继的规律是:若其右标志为“1”,则右链为线索,指示其后继,否则遍历右子树中第一个访问的结点(右子树中最左下的结点)为其后继。不含头结点的线索二叉树的遍历算法如下。

1.求中序线索二叉树中中序序列下的第一个结点:

ThreadNode *Firstnode(ThreadNode *p){
    while(p -> ltag == 0)    p = p -> lchild;    //最左下结点(不一定是叶子结点)
    return p;
}

2.求中序线索二叉树中结点p在中序序列下的后继:

ThreadNode *Nextnode(TreadNode *p){
    if(p -> rtag == 0)    return Firstnode(p -> rchild);
    else    return p -> rchild;    //ltag == 1 直接返回后继线索
}

3.利用上面俩个算法,可以写出不含头结点的中序线索二叉树的中序遍历的算法:

void Inordor(ThreadNode *T)
    for(ThreadNode *p = Firstnode(T); p != NULL; p = Nextnode(p))
        visit(p);
}

        补充:将程序1中 ltag 和 lchild 换成 rtag 和 rchild,并将 Firstnode 换成 Lastnode,即为求中序线索二叉树的最后一个结点;将程序2中的 rtag 和 rchild 换成 ltag 和 lchild,即为求中序线索二叉树中结点p的前驱。

先序线索二叉树和后序二叉树

        先序线索二叉树中找结点的后继:如果有左孩子,则左孩子就是其后继;如果无左孩子但有右孩子,则右孩子就是其后继;如果为叶结点,则右链域直接指示了结点的后继

        后序线索二叉树中找结点的后继:1.若结点x是二叉树的根,则其后继为空;2.若结点x是其双亲的右孩子,或是其双亲的左孩子且其双亲没有右孩子,则其后继即为双亲;3.若结点x是其双亲的左孩子,且其双亲有右子树,则其后继为双亲的右子树上按后序遍历列出的第一个结点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值