HashMap之TreeNode(红黑树)源码分析

HashMap之TreeNode源码分析

首先,TreeNode不仅是红黑树,还是链表。继承了LinkedHashMap.Entry,而Entry继承了 HashMap.Node如下图
在这里插入图片描述

属性及构造方法

各属性的含义见下图
在这里插入图片描述

find()

根据key和key class查找节点,从当前节点开始,大于找右子树,小于找左子树。
在这里插入图片描述

putTreeVal()

给树添加一个节点,添加之后进行平衡操作balanceInsertion(),平衡之后需要确保在数组中的是根节点moveRootToFront()
在这里插入图片描述

removeTreeNode()

删除一个节点, 删除前进行一系列的判断(空、长度等)详见注释。
对于红黑树节点的删除,可以理解为:找一个替换节点(大于当前节点的最小节点),替换节点与要删除的节点位置交换,删除节点就到了替换节点的位置上,其实删除的节点应该是替换节点。删除后会调用删除后不一定满足红黑树的性质。调用balanceDeletion(),进行删除平衡。
在这里插入图片描述

treeify()

根据链表生成树,其实就是遍历链表,一个一个往红黑树里插入。插入后调用balanceInsertion(),插入后的平衡,详见代码注释
在这里插入图片描述

untreeify()

红黑树转链表,此方法要简单的多。
在这里插入图片描述

balanceInsertion()

此方法为为红黑树插入后的平衡,红黑树插入的逻辑也主要集中在此方法中。其中调用了rotateLeft()左旋,rotateRight()右旋方法可参考下方图片理解红黑树插入情景。
在这里插入图片描述
图片地址:https://www.processon.com/view/link/5dd5fc33e4b0f8a5c6e3e1b1
在这里插入图片描述
在这里插入图片描述

balanceDeletion()

删除后的平衡操作,其实就是各种情况的分析。
在这里插入图片描述

rotateLeft() 左旋

左旋,进行左旋的是,当前节点和他的右节点(可以参考图片)
右节点取代当前节点的位置(12到了5的位置上)
变为右节点的左节点(5下移了一级)
右节点的左节点变为当前节点的右节点(7变为5的右节点)
在这里插入图片描述

rotateRight() 右旋

右旋,进行右旋的是,当前节点和他的左节点(可参考图片)
左节点取代当前节点的位置(12到了19的位置上)
变为左节点的右节点(19下移了一级)
左节点的右节点变为当前节点的左节点(13变为19的左节点)
在这里插入图片描述

moveRootToFront()

看名字就知道是这个方法是干什么move root to front(移动root节点到前面)。移动之后会确认下当前数据结构是否符合红黑树性质checkInvariants()。
在这里插入图片描述

checkInvariants()

在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值