美文网首页
二叉树-前驱结点、后继节点

二叉树-前驱结点、后继节点

作者: 嗯o哼 | 来源:发表于2020-12-09 20:22 被阅读0次

一、前驱结点

中序遍历的前一个结点


image.png

中序遍历

先遍历左子树,再访问结点,然后遍历右子树

查询结点的前驱结点

1.如果结点的left不为空,那么它一定是有前驱结点,并且,前驱结点在它的左子树中
根据中序遍历的特点,左子树的最右边的结点,就是它的前驱结点

如:8的前驱结点是7
4的前驱结点是3
13的前驱结点是12

2.如果结点的left为空,并且parent不为空,那么它的前驱结点一定在它的parent.parent.parent...中。如果parent一直是left结点,那么可以继续向上查,如果parent是parent.right可以终止查询
原因:中序遍历中,当遍历右子树的时候,也只先遍历它的右子树的左子树,寻找前驱结点的时候,就是逆向查询

如5的前驱结点4:=> 5的parent是 6 , 6的parent是4,6是4的right结点所以5的结点是5.parent.parent
7的前驱结点6 : => 7的parent是6,7是6的right那么7的前驱结点是7.parent

3.如果left 为空,parent为空,说明该节点是根结点,所以它没有前驱结点

查找前驱结点

-(Node *)predecessorNode:(Node *)node{
    
    // 1.如果该节点的left不为空,前驱结点在左子树中的最右边
    Node *tempNode = node.left;
    if (tempNode != nil) {
        while (tempNode.right != nil) {
            tempNode = tempNode.right;
        }
        return tempNode;
    }
    // 2.如果left为空,parent中
    while (node.parent != nil && node == node.parent.right) {
        node = node.parent;
    }

    return node.parent;
}

二、后继结点

中序遍历时的后一个节点

查询结点的后继结点

1.如果结点的right不为空,那么它的后继结点就是它的右子树的最左边的那个结点

2.如果右子树为空,父结点不为空,查询父结点,直到某一个节点的是父结点是左子树中的时候,终止查询

3.如果右子树为空并且父结点为空的时候,说明没有后继结点

-(Node *)successor:(Node *)node{
    // 1.如果该节点的right不为空,后继结点就在它的右子树中
    Node *tempNode = node.right;
    if (tempNode != nil) {
        while (tempNode.right != nil) {
            tempNode = tempNode.right;
        }
        return tempNode;
    }
    
    // 2.如果right为空,parent不为空
    while (node.parent != nil && node == node.parent.left) {
        node = node.parent;
    }
    
    return node;
}

相关文章

  • 2018-09-07

    树的基本定义: 树是一种非线性结构,有一个直接前驱,可能有很多个后继 根节点:没有前驱结点 叶子节点:没有后继节点...

  • 二叉树-前驱结点、后继节点

    一、前驱结点 中序遍历的前一个结点image.png 中序遍历 先遍历左子树,再访问结点,然后遍历右子树 查询结点...

  • 在二叉树中找到一个节点的后继节点和前驱前驱节点,先序、中序、后序

    在二叉树中找到一个节点的后继节点和前驱前驱节点,先序、中序、后序遍历的分别实现 【题目】 现在有一种新的二叉树节点...

  • 数据结构第二次作业

    实现在单向链表中,返回某个节点的前驱. 原理说明 单向链表的特点是链表只有一个方向,即只有从前驱结点指向后继结点的...

  • 中序建立线索二叉树

    为什么使用中序遍历来建立线索二叉树? 因为中序遍历方便寻找前驱节点和后继节点,而先序遍历不方便找后继节点,后序遍历...

  • 数据结构之循环链表

    单链表:只能索引后继节点,不能索引前驱节点.到了尾部标识就停止了.问题:不从头结点,就无法访问到全局节点 循环链表...

  • 线性表

    线性表 线性表是一种典型的线性结构。头结点无前驱有一个后继,尾节点无后继有一个前驱。链表只能顺序查找,定位一个元素...

  • Python数据结构与算法2——双向链表

    双向链表 后继节点:指向下一个节点 前驱节点:指向前一个节点 头节点没有前驱节点,尾节点没有后继节点 实现功能 该...

  • 数据结构-线索二叉树

    定义 以上述结点结构构成的二叉链表作为二叉树的存储结构,叫做线索链表,其中指向结点前驱和后继的指针,叫做线索。加上...

  • [数据结构与算法-iOS 实现] 二叉树附demo,前序遍历、后

    二叉树附demo,前序遍历、后序遍历、层序遍历、删除一个二叉树的节点,前驱后继节点等概念啊和原理 demo 基本概...

网友评论

      本文标题:二叉树-前驱结点、后继节点

      本文链接:https://www.haomeiwen.com/subject/otwhgktx.html