news 2026/6/13 9:14:25

红黑树太难?手绘 几张图,带你从二叉树推导到红黑树(数据结构硬核篇)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
红黑树太难?手绘 几张图,带你从二叉树推导到红黑树(数据结构硬核篇)

标签:#数据结构 #算法 #红黑树 #Java集合 #面试必备 #可视化


💀 前言:二叉搜索树 (BST) 的“死穴”

我们都知道二叉搜索树(BST)的特性:左子树 < 根 < 右子树。
在理想情况下,它的查找效率是 。
但在极端情况下(例如插入 1, 2, 3, 4, 5),它会退化成一条链表,效率暴跌至 。

BST 退化示意图 (Mermaid):

退化 BST (链表)

1

2

3

4

5

理想 BST (平衡)

2

1

3

为了解决这个问题,我们需要自平衡。AVL 树追求极致平衡(高度差不超过 1),但维护成本太高。于是,红黑树横空出世。


🔑 一、 降维打击:红黑树的本质是 2-3 树

如果你直接看红黑树的 5 条规则,绝对会晕。
但如果你先看2-3 树,一切都豁然开朗。

1. 什么是 2-3 树?
  • 2-节点:存 1 个值,有 2 个孩子(和普通二叉树一样)。
  • 3-节点:存 2 个值,有 3 个孩子(比如[3, 5]在一个节点里)。

2-3 树的核心特性:绝对平衡。所有叶子节点都在同一层!
当插入数据导致节点“过胖”(变成 4-节点)时,它会中间向上分裂,保持高度平衡。

2. 红黑树怎么来的?

红黑树其实就是用二叉树的形式来模拟 2-3 树

  • 2-节点 黑色节点。
  • 3-节点一黑一红(红节点通过红链接挂在黑节点旁边)。

映射关系图 (Mermaid):

红黑树的表示

Red_Link

B

A

右子树

左子树

中子树

2-3 树的 3-节点

A , B

Wait

Wait

Wait

秒懂结论:

  • 红链接:不仅仅是颜色,它代表**“结合”。红节点和它的黑父节点,其实在逻辑上是同一个大节点**(3-节点)。
  • 黑链接:代表普通的父子关系。

📜 二、 破解红黑树的 5 条天书规则

理解了“红黑树 = 2-3 树”后,我们再看规则,简直就是废话:

规则为什么?(2-3 树视角)
1. 节点是红或黑因为要区分是 2-节点还是 3-节点。
2. 根节点是黑色根节点如果红了,说明它是别人的子(3-节点的一部分),但它是根,没爸爸,所以必须黑。
3. 叶子(NIL)是黑色空节点默认为黑,为了方便计算黑高。
4. 不能有两个红节点相连核心!因为 3-节点(红+黑)是允许的,但 4-节点(红+红+黑)在标准红黑树中需要分裂,不允许保留。
5. 任意路径黑节点数相同核心!因为 2-3 树是绝对平衡的。红节点是“内部融合”的,不贡献高度。去掉红节点,大家高度当然一样!

🛠️ 三、 三板斧:左旋、右旋、变色

当插入新节点(默认为红色,因为我们总想把新值融合进现有的节点,凑成 3-节点)时,可能会破坏规则。我们需要三招来修复。

1. 左旋 (Left Rotate)

右边出现红节点时(因为我们规定红节点只能挂在左边,或者为了平衡),需要左旋。

左旋后

Red

S

E

A

左旋前

Red

E

S

A

2. 右旋 (Right Rotate)

左边出现连续两个红节点(双红违规)时,需要右旋。

3. 颜色翻转 (Color Flip)

当一个节点的左右孩子都是红色时。
这意味着它变成了一个临时 4-节点[红, 黑, 红]
在 2-3 树中,4-节点需要分裂:中间的提上去(变红),两边的独立(变黑)。

颜色翻转示意图 (Mermaid):

翻转后 (分裂)

H

L

R

翻转前 (临时4节点)

Red

Red

H

L

R


⚔️ 四、 实战演练:插入推导

假设我们要插入序列:10, 20, 30

  1. 插入 10:根节点,直接变黑。
  • 10(黑)
  1. 插入 20:新节点为红,比 10 大,放右边。
  • 10(黑) ---<红>--- 20(红)
  • 违规:右边有红链接!
  • 修正左旋。变成20(黑) ---<红>--- 10(红)
  1. 插入 30:新节点为红,比 20 大,放右边。
  • 20(黑) ---<红>--- 30(红)(左边还有个 10(红))
  • 现在状态:10(红) --- 20(黑) --- 30(红)
  • 触发:左右双红 ->颜色翻转
  • 10(黑),20(红),30(黑)
  • 20是根,必须变黑。
  • 最终:20(黑)为根,左右是10(黑)30(黑)。完美平衡!

🎯 总结

红黑树并没有那么可怕,它只是2-3 树的“二进制”影分身

  • 所有的红色节点,都只是在依附于父亲,假装自己和父亲是一个大节点。
  • 所有的旋转和变色,都只是为了模拟 2-3 树的分裂和生长。

下次面试官再问你红黑树,不要背口诀,试着画出那个 2-3 树的对应关系,告诉他:“红黑树就是为了保证黑高平衡。”

Next Step:
打开 JDK 源码,找到TreeMap.java,搜索rotateLeftfixAfterInsertion方法。对照着上面的图,你会发现那些曾经像天书一样的代码,现在竟然能读懂了!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 23:08:33

API文档撰写规范:清晰易懂地说明GLM-TTS接口用法

API文档撰写规范&#xff1a;清晰易懂地说明GLM-TTS接口用法 在智能语音应用日益普及的今天&#xff0c;用户不再满足于“能说话”的机器&#xff0c;而是期待更自然、有情感、个性化的语音交互体验。从虚拟主播到个性化有声书&#xff0c;从教育配音到多语言内容生成&#xff…

作者头像 李华
网站建设 2026/6/13 1:49:26

栈溢出攻击原理与防御

栈溢出攻击原理与防御 栈的结构与特性 栈&#xff08;Stack&#xff09;是用于存储函数调用过程中局部变量、参数、返回地址以及保存的寄存器值的内存区域。每次函数调用时&#xff0c;系统会在栈上分配一个栈帧。栈的生长方向是从高地址向低地址&#xff0c;而缓冲区数据的写入…

作者头像 李华
网站建设 2026/6/11 2:28:29

安装包打包规范:为GLM-TTS制作一键部署发行版

安装包打包规范&#xff1a;为GLM-TTS制作一键部署发行版 在语音合成技术飞速演进的今天&#xff0c;一个令人兴奋的趋势正在发生&#xff1a;我们不再需要为每个说话人重新训练模型&#xff0c;也能生成高度逼真的个性化语音。GLM-TTS 正是这一趋势下的代表性成果——它基于大…

作者头像 李华
网站建设 2026/6/12 4:20:33

元宇宙应用场景:在VR环境中使用个性化语音合成

元宇宙中的声音人格&#xff1a;VR环境下的个性化语音合成实践 在虚拟现实&#xff08;VR&#xff09;世界中&#xff0c;当你的数字分身第一次开口说话——是机械单调的合成音&#xff0c;还是带着你真实语调、情绪起伏的声音&#xff1f;这个看似微小的差异&#xff0c;恰恰决…

作者头像 李华
网站建设 2026/6/10 15:36:22

从本地到云端:我亲历的AI模型部署之路,这笔“账”你得这么算

每次和同行、客户聊起AI项目的落地&#xff0c;话题总会不可避免地拐到一个核心抉择上&#xff1a;这模型&#xff0c;咱们是放在自己机房里跑&#xff0c;还是扔到云上去&#xff1f;这问题听起来像是技术选型&#xff0c;但在我这些年摸爬滚打的经历里&#xff0c;它早就不止…

作者头像 李华
网站建设 2026/6/6 8:19:51

GLM-TTS KV Cache加速原理与实际性能增益测试

GLM-TTS KV Cache加速原理与实际性能增益测试 在当前AI语音合成技术快速演进的背景下&#xff0c;零样本语音克隆&#xff08;Zero-shot Voice Cloning&#xff09;正逐步从实验室走向实际应用。GLM-TTS作为一款支持多语言、高保真度且具备音素级控制能力的开源TTS模型&#x…

作者头像 李华