数据结构笔记——线索二叉树找前驱/后继

目录

一、中序线索二叉树找中序后继

二、中序线索二叉树中找中序前驱

三、先序线索二叉树找先序后继

四、先序线索二叉树找先序前驱

五、后序线索二叉树找后序前驱

六、后序线索二叉树找后序后继

七、总结

一、中序线索二叉树找中序后继

在中序线索二叉树中找到指定结点*p的中序后继next

①若p->rtag == 1,则next = p->rchild

②若p->rtag == 0

//找到以P为跟的子树中,第一个被中序遍历的结点
ThreadNode *Firstnode(ThreadNode *p){
    //循环找到最左下结点(不一定是叶子结点)
    while(p->ltag == 0)
        p = p->lchild;
    return p;
}

//在中序线索二叉树中找到结点p的后继结点
ThreadNode *Nextnode(ThreadNode *p){
    //右子树中最左下结点
    if(p->rtag == 0)
        return Firstnode(p->rchild);
    else
        return p->rchild;
}

//对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)  空间复杂度O(1)
void Inorder(ThreadNode *T){
    for(ThreadNode *p = Firstnode(T);p != NULL; p = Nextnode(p))
        visit(p);
}

二、中序线索二叉树中找中序前驱

在中序线索二叉树中找到指定结点*p的中序前驱pre

①若p->ltag == 1,则pre = p->lchild

②若p->ltag == 0

//找到以P为跟的子树中,最后一个被中序遍历的结点
ThreadNode *Lastnode(ThreadNode *p){
    //循环找到最右下结点(不一定是叶子结点)
    while(p->rtag == 0)
        p = p->rchild;
    return p;
}

//在中序线索二叉树中找到结点p的前驱结点
ThreadNode *Prenode(ThreadNode *p){
    //左子树中最右下结点
    if(p->ltag == 0)
        return Lastnode(p->lchild);
    else
        return p->lchild;
}

//对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)  空间复杂度O(1)
void RevInorder(ThreadNode *T){
    for(ThreadNode *p = Lastnode(T);p != NULL; p = Prenode(p))
        visit(p);
}

三、先序线索二叉树找先序后继

在先序线索二叉树中找到指定结点*p的先序后继next

①若p->rtag == 1,则next = p->rchild

②若p->rtag == 0

四、先序线索二叉树找先序前驱

在先序线索二叉树中找到指定结点*p的先序前驱pre

①若p->ltag == 1,则next = p->lchild

② 若p->ltag = 0

前提:改用三叉链表可以找到父节点

①如果能找到p的父节点,且p是左孩子

②如果能找到p的父节点,且p是右孩子,其左兄弟为空

③如果能找到p的父节点,且p是右孩子,其左兄弟非空

④如果p是根结点,则p没有先序前驱

五、后序线索二叉树找后序前驱

在后序线索二叉树中找到指定结点*p的后序前驱pre

①若p->ltag == 1,则pre = p->lchild

②若p->ltag == 0

六、后序线索二叉树找后序后继

在后序线索二叉树中找到指定结点*p的后序后继next

①若p->rtag == 1,则next = p->rchild

②若p->rtag == 0

前提:改用三叉链表可以找到父节点

①如果能找到p的父节点,且p是右孩子

②如果能找到p的父节点,且p是左孩子,且右兄弟为空

③如果能找到p的父节点,且p是左孩子,且右兄弟非空

④如果p是根节点,则p没有后序后继

七、总结

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如初⁰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值