在线索二叉树中找前驱和后继

简介: 在线索二叉树中找前驱和后继

一、线索二叉树找前驱和后继

(一)中序线索二叉树

1. 中序线索二叉树找中序后继

在这里插入图片描述

//找到以P为根的子树中,第一个被中序遍历的结点
ThreadNode *Firstnode(ThreadNode *p){
    //循环找到最左下结点(不一定是叶结点)
    while(p-> == 0) p=p->lchild;
    return p;
}
//在中序线索二叉树中找到结点p的后继结点
ThreadNode *Nextnode(ThreadNode *p){
    //右子树最左下结点
    if(p->rtag == 0) return Firstnode(p->rchild);
    else return p->rchild;//rtag==1直接返回后继线索
}

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

2. 中序线索二叉树找中序前驱

在这里插入图片描述

//找到以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;//ltag==1直接返回前驱线索
}

//对中序线索二叉树进行逆向中序遍历
void RevInorder(ThreadNode *T){
    for(ThreadNode *p = LastNode(T); p!=NULL ; p=Prenode(p))
        visit(p);
}
123456789101112131415161718

(二)先序线索二叉树

1. 先序线索二叉树找先序后继

在这里插入图片描述

2. 先序线索二叉树找先序前驱

在这里插入图片描述
在这里插入图片描述

(三)后序线索二叉树

1. 后序线索二叉树找后序前驱

在这里插入图片描述

2. 后序线索二叉树找后序后继

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章
【剑指offer】-链表中倒数第K个结点-14/67
【剑指offer】-链表中倒数第K个结点-14/67
【剑指offer】-链表中倒数第K个结点-14/67
|
9月前
快慢指针之:链表中倒数第k个结点
快慢指针之:链表中倒数第k个结点
二叉树的后继节点
二叉树的后继节点
82 0
剑指offer 58. 二叉搜索树的第k个结点
剑指offer 58. 二叉搜索树的第k个结点
72 0
先序、中序、后序遍历确定唯一树
快速学习先序、中序、后序遍历确定唯一树
先序、中序、后序遍历确定唯一树
|
开发工具
15分钟精通二叉树,二叉树的先序,中序,后序,层次遍历顺序
🍀🍀🍀理解,掌握二叉树先序,中序,后序,层次四种遍历顺序
197 0
15分钟精通二叉树,二叉树的先序,中序,后序,层次遍历顺序
前驱结点与后驱结点(前驱、后驱概念来源于中序遍历)
前驱结点与后驱结点(前驱、后驱概念来源于中序遍历)
408 0
前驱结点与后驱结点(前驱、后驱概念来源于中序遍历)

热门文章

最新文章