HashMap之TreeNode(红黑树)源码分析
HashMap-TreeNode源码分析(jdk1.8
- HashMap之TreeNode源码分析
- 属性及构造方法
- find()
- putTreeVal()
- removeTreeNode()
- treeify()
- untreeify()
- balanceInsertion()
- balanceDeletion()
- rotateLeft() 左旋
- rotateRight() 右旋
- moveRootToFront()
- checkInvariants()
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()
HashMap之TreeNode(红黑树)源码分析相关推荐
- 【转】HashMap,ArrayMap,SparseArray源码分析及性能对比
HashMap,ArrayMap,SparseArray源码分析及性能对比 jjlanbupt 关注 2016.06.03 20:19* 字数 2165 阅读 7967评论 13喜欢 43 Array ...
- 字节跳动Android三面视频解析:framework+MVP架构+HashMap原理+性能优化+Flutter+源码分析等
前言 对于字节跳动的二面三面而言,Framework+MVP架构+HashMap原理+性能优化+Flutter+源码分析等问题都成高频问点!然而很多的朋友在面试时却答不上或者答不全!今天在这分享下这些 ...
- 红黑树java源代码分析_JAVA 红黑树源码
class RBTree>{ private static final String RedColor = "red"; private static final Strin ...
- NGINX下的红黑树源码详解(附 流程图和GIF)
之前博主稍微讲解了下红黑树的原理,那么在这篇博客博主想要把红黑树讲的更加的透彻,以便于更多的人了解红黑树 (本博客会更加详细的介绍之前的博客没介绍到的,所以各位看官不同再回去翻看博主之前那篇红黑树的原 ...
- Linux内核的红黑树源码实现以及调用
红黑树可以说是程序员经常遇到的一种数据结构,不管是工作还是面试都会涉及,有时候还会让你写一段红黑树代码. 本文主要是讲Linux中的红黑树,关于红黑树定义参考wiki:https://en.wikip ...
- 红黑树源码及错误解析
/* 作者:田帅 学校:**大学 版本:红黑树初始版本 */ #include"stdio.h" #include"malloc.h" #define MIN ...
- HashMap、ConcurretnHashMap面试题详解,源码分析
文章目录 面试题 HashMap.LinkedHashMap和TreeMap的区别是什么? ①:为什么hashmap每次扩容大小为2的n次方? ③:jdk1.7的hashmap的扩容操作是在元素插入之 ...
- HashMap、ConcurrentHashMap(1.7、1.8)源码分析 + 红黑树
个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 序号 内容 1 Java基础面试题 2 JVM面试题 3 Java并发编程面试 4 计算 ...
- HashMap红黑树原理及源码分析---图形、注释一应俱全
目录 一.红黑树定义 二.节点新增原理: 三.红黑树的生成 2.1 一个节点 2.2 两个节点 2.3 三个节点 2.3.1 第二个节点作为root右子树情况下 2.3.2 第二个节点作为root左子 ...
最新文章
- bzoj 1441: Min 裴蜀定理
- 管道符和作业控制 shell变量 环境变量配置文件
- 给服务器装系统U盘要处理吗,服务器装系统从u盘装
- MySQL服务的启动与停止-使用命令行工具
- SPOJ - LCS2 Longest Common Substring II(后缀自动机)
- 你是第几名:Excel 中 Large 和 Small 的用法
- [物理学与PDEs]第1章第6节 电磁场的标势与矢势 6.3 例 --- 电偶极辐射
- 影像拼接(3种方法)
- 回归指令_用一条指令在新款 Mac 上找回经典的开机启动声
- spring + hibernate + mysql 事务不回滚
- 华为徐直军:今年超3亿设备搭载鸿蒙系统
- 量子计算机概念谁提出来,目前的量子计算机从根本上来说是一个伪概念
- 若依前后端分离集成Mybatis-Plus
- CSS中Position定位属性的使用
- html5-5 HTML5表单元素和内嵌框架
- 问题2:无法打开包括文件:“windows.h”:No such file or directory
- M3U8视频流下载神器CocoCut
- 七夕到了 —— 属于 Java 的浪漫,拿去吧~ 祝表白成功
- binlog2sql快速闪回
- 12、Hadoop框架MapReduce 统计人数、总分、关联