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

目录

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

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

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

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

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

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

七、总结

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

数据结构笔记——线索二叉树找前驱/后继_第1张图片

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

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

②若p->rtag == 0

数据结构笔记——线索二叉树找前驱/后继_第2张图片

//找到以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);
}

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

数据结构笔记——线索二叉树找前驱/后继_第3张图片

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

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

②若p->ltag == 0

数据结构笔记——线索二叉树找前驱/后继_第4张图片

数据结构笔记——线索二叉树找前驱/后继_第5张图片

//找到以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);
}

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

数据结构笔记——线索二叉树找前驱/后继_第6张图片

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

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

②若p->rtag == 0

数据结构笔记——线索二叉树找前驱/后继_第7张图片

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

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

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

② 若p->ltag = 0

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

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

数据结构笔记——线索二叉树找前驱/后继_第8张图片

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

数据结构笔记——线索二叉树找前驱/后继_第9张图片

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

数据结构笔记——线索二叉树找前驱/后继_第10张图片

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

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

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

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

②若p->ltag == 0

数据结构笔记——线索二叉树找前驱/后继_第11张图片

数据结构笔记——线索二叉树找前驱/后继_第12张图片

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

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

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

②若p->rtag == 0

数据结构笔记——线索二叉树找前驱/后继_第13张图片

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

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

数据结构笔记——线索二叉树找前驱/后继_第14张图片

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

数据结构笔记——线索二叉树找前驱/后继_第15张图片

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

数据结构笔记——线索二叉树找前驱/后继_第16张图片

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

七、总结

数据结构笔记——线索二叉树找前驱/后继_第17张图片

数据结构笔记——线索二叉树找前驱/后继_第18张图片

你可能感兴趣的:(考研数据结构)