美文网首页
十三、前驱节点(predecessor)&后继节点(succes

十三、前驱节点(predecessor)&后继节点(succes

作者: 咸鱼Jay | 来源:发表于2022-01-21 09:27 被阅读0次

前驱节点(predecessor)

  • 前驱节点:中序遍历时的前一个节点
    • 如果是二叉搜索树,前驱节点就是前一个比它小的节点
前驱节点(predecessor)

寻找前驱节点有三种情况:

node.left != null(左子树不为null)
举例:6、13、8
前驱节点:predecessor = node.left.right.right.right...
终止条件:rightnull

node.left == null && node.parent != null(左子树为null但是它的父节点不为null)
举例:7、11、9、1
前驱节点:predecessor = node.parent.parent.parent...
终止条件:nodeparent的右子树中

node.left == null && node.parent == null(左子树为null并且父节点也为null)
举例:没有左子树的根节点(上图中8没有左子树的情况)
那就没有前驱节点

private Node<E> predecessor(Node<E> node){
    if(node == null) return null;
    
    // 前驱节点在左子树当中(left.right.right.right...)
    Node<E> p = node.left;
    if(p != null) {
        while (p.right != null) {
            p = p.right;
        }
        return p;
    }
    
    // 从父节点、祖父节点中寻找前驱节点
    while(node.parent != null && node == node.parent.left) {
        //该节点的父节点不为空,并且该节点是父节点的左孩子
        node = node.parent;
    }
    // 第一种情况:node.parent == null
    // 第二种情况:node == node.parent.right
    return node.parent;
}

后继节点(successor)

  • 后继节点:中序遍历时的后一个节点
    • 如果是二叉搜索树,后继节点就是后一个比它大的节点


      后继节点(successor)

寻找后继节点有三种情况:

node.right != null
举例:1、8、4
后继节点:successor = node.right.left.left.left...
终止条件:leftnull

node.right == null && node.parent != null
举例:7、6、3、11
后继节点:successor = node.parent.parent.parent...
终止条件:nodeparent的左子树中

node.right == null && node.parent == null
举例:没有右子树的根节点(上图中8没有右子树的情况)
那就没有前驱节点

private Node<E> successor(Node<E> node){
    if(node == null) return null;
    
    // 后继节点在右子树当中(right.left.left.left...)
    Node<E> p = node.right;
    if(p != null) {
        while (p.left != null) {
            p = p.left;
        }
        return p;
    }
    
    // 从父节点、祖父节点中寻找后继节点
    while(node.parent != null && node == node.parent.right) {
        //该节点的父节点不为空,并且该节点是父节点的右孩子
        node = node.parent;
    }
    // 第一种情况:node.parent == null
    // 第二种情况:node == node.parent.left
    return node.parent;
}

代码链接

相关文章

  • 十三、前驱节点(predecessor)&后继节点(succes

    前驱节点(predecessor) 前驱节点:中序遍历时的前一个节点如果是二叉搜索树,前驱节点就是前一个比它小的节...

  • 链表

    基础概念:节点(Node)是其中的元素,相邻节点彼此互称前驱(predecessor)或后继(successor)...

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

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

  • 线性结构-链表

    链表定义 n个节点离散分配 彼此通过指针相连 每个节点只有一个前驱节点,每个节点只有一个后继节点 首节点没有前驱节...

  • 2018-09-07

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

  • 19-前驱节点和后继节点

    一、前驱节点 二、后继节点 代码以二叉搜索树为例: 三、完善二叉搜索树代码,remove只针对二叉搜索树 删除代码...

  • Redis源码分析(二)——Redis数据结构-链表

    数据结构——节点 prev:链表节点的前驱 next:链表节点的后继 value:节点中的值 数据结构——链表 h...

  • 二叉搜索树的前驱和后继节点

    前驱节点val值小于该节点val值并且值最大的节点后继节点val值大于该节点val值并且值最小的节点 BST.pn...

  • LinkedList源码剖析

    链表有一个默认的头节点,头节点的类型尾entry(链表节点),entry有三个属性:节点值,前驱指针,后继指针。 ...

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

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

网友评论

      本文标题:十三、前驱节点(predecessor)&后继节点(succes

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