TreeMap方法successor/predecessor图解

方法功能介绍

TreeMap遍历算法属于二叉排序树范畴

  • 二叉树:https://blog.csdn.net/dengjili/article/details/111350037
  • 二叉排序树参考:https://blog.csdn.net/dengjili/article/details/111503799

根据二叉树前序遍历,假设遍历结果为,a、b、c、d;当前节点为c
那么前驱节点为b;后驱节点为d

对应方法分别如下

  • successor,寻找当前节点后驱节点
  • predecessor,寻找当前节点前驱节点

前序遍历算法:1. 左孩子;2. 节点;3. 右孩子

successor图解【寻找当前节点后驱节点】

  • CASE1,当前节点右孩子不为空【*前序遍历算法中当前节点为根节点,找右孩子

在这里插入图片描述
将当前节点(7)右孩子(10)当做子树(如图所示,看成一个整体),那么当前节点的后驱一定在这个子树中。找出子树最小节点(8)。
即:节点7的后驱为8

  • CASE2,当前节点右孩子为空【*前序遍历算法中当前节点为左孩子,找根节点
    在这里插入图片描述

当前节点(7)作为左子树中一个结点,找出根节点(8)
即:节点7的后驱为8

下图也是CASE2场景

在这里插入图片描述

predecessor图解【寻找当前节点前驱节点】

  • CASE3,当前节点左孩子不为空【*前序遍历算法中当前节点为根节点,找左孩子

在这里插入图片描述

将当前节点(7)左孩子(5)当做子树(如图所示,看成一个整体),那么当前节点的前驱一定在这个子树中。找出子树最大节点(6)。
即:节点7的后驱为8

  • CASE4,当前节点左孩子为空【*前序遍历算法中当前节点为右孩子,找根节点
    在这里插入图片描述

当前节点(7)作为右子树中一个结点,找出根节点(2)
即:节点7的后驱为2

下图也是CASE4场景

在这里插入图片描述

代码图形对应

对应图形查看代码即可,当前节点为入参t;代码非常简单,请查看

static <K,V> TreeMap.Entry<K,V> successor(Entry<K,V> t) {
    if (t == null)
        return null;
	// CASE1
    else if (t.right != null) {
        Entry<K,V> p = t.right;
        while (p.left != null)
            p = p.left;
        return p;
    } 
	// CASE2
	else {
        Entry<K,V> p = t.parent;
        Entry<K,V> ch = t;
        while (p != null && ch == p.right) {
            ch = p;
            p = p.parent;
        }
        return p;
    }
}


static <K,V> Entry<K,V> predecessor(Entry<K,V> t) {
    if (t == null)
        return null;
	// CASE3
    else if (t.left != null) {
        Entry<K,V> p = t.left;
        while (p.right != null)
            p = p.right;
        return p;
    } 
	// CASE4
	else {
        Entry<K,V> p = t.parent;
        Entry<K,V> ch = t;
        while (p != null && ch == p.left) {
            ch = p;
            p = p.parent;
        }
        return p;
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值