Java HashMap 源码中红黑树 TreeNode 怎么旋转平衡

落丽君_3822

落丽君_3822

2026-09-09

663人浏览

原创

java hashmap红黑树通过左旋、右旋配合变色操作维持平衡:左旋将右子节点提为父节点,右旋将左子节点提为父节点,旋转调整结构后必须结合变色才能满足红黑树五条性质,且仅在链表长度≥8且数组容量≥64时触发树化。

java hashmap 源码中红黑树 treenode 怎么旋转平衡

Java HashMap 中的红黑树 TreeNode 通过 左旋 和 右旋 配合变色操作实现插入/删除后的平衡。旋转本身不直接“修复红黑性质”,而是调整结构,为后续变色腾出空间,最终满足红黑树五条基本性质。

左旋操作:把右子节点提为父节点

当某个节点 p 的右子节点 r 存在,且 r 是红色、其左子树(rl)可能非空时,左旋将 r 上移为新父节点,p 成为其左子节点:

  • r.left 原本是 rl,旋转后要接在 p.right 上,同时维护双向父子引用(rl.parent = p)
  • p.parent 改为 r.parent;若 p 原是根节点,则 r 成为新根并置为黑色
  • 否则根据 p 在其原父节点中的左右位置,把 r 接到对应侧(如 pp.left == p,则 pp.left = r)
  • 最后设置 r.left = p 且 p.parent = r

右旋操作:把左子节点提为父节点

逻辑与左旋对称。当节点 p 的左子节点 x 存在时,右旋使 x 成为新父节点,p 变为其右子节点:

Rydberg Agent Node
Rydberg Agent Node

使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r

下载
  • x.right(即原 lr)若非空,需设为 p.left 并更新 lr.parent = p
  • x.parent 设为 p.parent;若 p 是根,则 x 成根并染黑
  • 否则将 x 接入 p.parent 对应侧(左/右)
  • 再令 x.right = p,p.parent = x

旋转不是孤立动作,必须配合变色才真正平衡

单纯旋转无法保证红黑性质,尤其是“无连续红节点”和“黑高一致”。HashMap 的 balanceInsertion 方法在插入新红节点后,按四种典型场景处理:

  • 叔叔节点为空或为黑 → 直接旋转 + 变色(爷爷变红、父和叔变黑,或父变黑、爷爷变红再旋转)
  • 叔叔为红 → 先变色(爷爷和叔叔变红,父变黑),再递归检查爷爷节点
  • 旋转方向取决于插入路径形态(直线型 vs 折线型),比如“父右 + 新节点右”触发左旋,“父左 + 新节点左”触发右旋
  • 所有路径最终确保根为黑、无双红、各路径黑节点数相等

实际触发时机由树化条件控制

TreeNode 的旋转只在红黑树结构内生效,而该结构本身只在特定条件下启用:

  • 链表长度 ≥ 8 且 数组容量 ≥ 64,才会调用 treeifyBin() 启动树化
  • 插入新键值对时,先按哈希定位桶,再在树中逐层比较 hash 或 key,找到叶子位置插入 TreeNode
  • 每次插入后立即调用 balanceInsertion(root, x),从新节点向上修正,可能涉及多次旋转+变色
  • 退化条件(节点 ≤ 6)会调用 untreeify() 拆回链表,此时旋转逻辑不再参与

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java node

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10057

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7202

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6332

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1104

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1336

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2649

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19971

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习