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

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

二叉搜索树的前驱节点

  • 先了解一下前驱节点
    • 前驱节点:中序遍历时的前一个节点
    • 但如果是二叉搜索树,前驱节点就是前一个比它小的节点

image-20220119144149156

  • 找前驱节点两种情况:

    1. 当前节点的左子树不为空。则一直遍历左子树的右节点,直至为null。

    2. 当前节点的左子树为空,则从父节点开始寻找前驱节点:

      1. 如果当前节点为父节点的右子树,则父节点即为前驱节点。例:7的前驱节点为6。
      2. 如果当前节点为父节点的左子树,则依次遍历父节点,直至遍历的节点为父节点的右子树为止。因为属于父节点的左子树都是比该节点大的,循环遍历到节点为父节点的右子树时,该节点的父子树才比该节点小。例如:9的前驱节点为8。
      3. 如果父节点为空,返回当前节点的父节点,即==null。

    上代码:

    public Node<E> predecessor(Node<E> node){
            if ( node == null ) return null;
            Node<E> p =node.left;
            if ( p != null ){
                //1.当前节点的左子树不为空
                while(p.right != null){
                    p = p.right;
                }
                return p;
            }
            //2.当前节点的左子树为空
            // 从父节点、祖父节点中寻找前驱节点
            while(node.parent != null && node == node.parent.left){
                node = node.parent;
            }
            //3.循环到这有两种情况
            //3.1 node.parent == null;-->即前驱节点为null(也可以是node.parent)
            //3.2 node = node.parent.right;-->即前驱节点为node.parent
            return node.parent;
        }
    

    二叉搜索树的后继节点

  • 后继节点:中序遍历时的后一个节点

  • 如果是二叉搜索树,后继节点就是一个比它大的节点

    image-20220119154219467

  • 找后继节点有两种情况:

  1. 当前节点的右子树不为空。则一直遍历右子树的左节点,直至为null。
  2. 当前节点的右子树为空,则从父节点开始寻找后继节点:
    1. 如果当前节点为父节点的左子树,则后继节点即为父节点。例:9的后继节点为10。
    2. 如果当前节点为父节点的右子树,则依次遍历父节点,直至遍历节点的父节点为左子树为止,因为如果遍历的父节点一直为右节点,肯定是比该节点小的,只有找到节点的父节点为左子树时,找到节点的父节点才比它大,即为后继节点。
    3. 如果父节点为空,返回当前节点的父节点,即==null。
  • 上代码:
public Node<E> successor(Node<E> node){
        if (node == null ) return null;
        Node<E> p = node.right;
        if (p != null ){
            // 1.前驱节点在左子树当中(right.left.left.left....)
            while( p.left != null){
                p = p.left;
            }
            return  p;
        }
        //2.从父节点,祖父节点寻找前驱节点
        while(node.parent != null && node == node.parent.right){
            node = node.parent;
        }

        return node.parent;
    }
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员阿红

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

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

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

打赏作者

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

抵扣说明:

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

余额充值