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

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 变为其右子节点:
使用一条命令部署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 大师之旅:从入门到精通的终极指南










