前言

红黑树是算法领域中一个著名的二叉查找树实现,它能够以较小的开销保持二叉查找树的平衡。具备平衡性质的二叉查找树能够极大地提高节点的查询速度。举个形象一点的例子:从一个十亿节点的红黑树中查找一个节点,所需要的查询次数不到 30,这不禁让人感叹算法的魅力。

红黑树是工程中最常见的二叉查找树的实现,例如在 Linux 的内存管理和进程管理中就用到了红黑树;Java 语言的集合包、C++语言的标准模板库中均提供了红黑树的实现类。

红黑树本身的设计很复杂,多数情况下我们也不需要自己去实现红黑树,但研究红黑树还是有意义的。一方面可以让学习者领略这种神奇的数据结构的奥妙,另一方面可以作为一种思维训练工具,提升自己的算法设计能力。

本文以漫画形式讲述红黑树,第一话讲解二叉查找树的概念和基本操作,包括节点查找、插入、删除;第二话讲解二叉查找树的缺点和红黑树的概念,以及红黑树的节点旋转操作;第三话讲解红黑树的节点插入操作;第四话讲解红黑树的节点删除操作;第五话和彩蛋部分讲解红黑树在插入修正和删除修正时,对各种 CASE 所进行的调整操作背后的思想。

红黑树的实现中,最难的部分在于实现节点的插入和删除时,要穷举所有可能的 CASE,然后对每种 CASE 进行处理。在理解节点的插入和删除的过程时,读者要把握住一个中心:每种 CASE 所进行的调整步骤都在尽量恢复插入/删除节点后所违反的红黑树特性,如果当前 CASE 解决不了,就转成另一种更接近问题解决状态的 CASE。每种 CASE 的所进行的调整步骤都是为了向解决问题的出口更靠近一步,直至找到出口。

漫画采用大量的图示来展示红黑树操作的诸多细节,作者力求详尽,因此篇幅略长。在 PDF 中给出了完整的二叉查找树定义 + 测试代码,以及红黑树定义 + 测试代码。两份代码均经过了若干次十万数量级随机节点插入和删除测试,结果均无误。读者可贴到自己的 IDE 中,结合本文讲解进行调试研究。

在电脑端本文阅读效果更佳。

正文

太秀了!红黑树杀人事件始末_红黑树太秀了!红黑树杀人事件始末_红黑树_02太秀了!红黑树杀人事件始末_算法_03太秀了!红黑树杀人事件始末_二叉查找树_04太秀了!红黑树杀人事件始末_红黑树_05太秀了!红黑树杀人事件始末_红黑树_06太秀了!红黑树杀人事件始末_红黑树_07太秀了!红黑树杀人事件始末_二叉查找树_08太秀了!红黑树杀人事件始末_二叉查找树_09太秀了!红黑树杀人事件始末_红黑树_10太秀了!红黑树杀人事件始末_算法_11太秀了!红黑树杀人事件始末_红黑树_12太秀了!红黑树杀人事件始末_红黑树_13太秀了!红黑树杀人事件始末_算法_14太秀了!红黑树杀人事件始末_二叉查找树_15太秀了!红黑树杀人事件始末_二叉查找树_16太秀了!红黑树杀人事件始末_算法_17太秀了!红黑树杀人事件始末_二叉查找树_18太秀了!红黑树杀人事件始末_二叉查找树_19太秀了!红黑树杀人事件始末_二叉查找树_20太秀了!红黑树杀人事件始末_二叉查找树_21太秀了!红黑树杀人事件始末_算法_22太秀了!红黑树杀人事件始末_算法_23太秀了!红黑树杀人事件始末_二叉查找树_24太秀了!红黑树杀人事件始末_算法_25太秀了!红黑树杀人事件始末_红黑树_26太秀了!红黑树杀人事件始末_红黑树_27太秀了!红黑树杀人事件始末_算法_28太秀了!红黑树杀人事件始末_算法_29太秀了!红黑树杀人事件始末_红黑树_30太秀了!红黑树杀人事件始末_二叉查找树_31太秀了!红黑树杀人事件始末_算法_32太秀了!红黑树杀人事件始末_二叉查找树_33太秀了!红黑树杀人事件始末_二叉查找树_34太秀了!红黑树杀人事件始末_红黑树_35太秀了!红黑树杀人事件始末_红黑树_36太秀了!红黑树杀人事件始末_红黑树_37太秀了!红黑树杀人事件始末_红黑树_38太秀了!红黑树杀人事件始末_二叉查找树_39太秀了!红黑树杀人事件始末_二叉查找树_40太秀了!红黑树杀人事件始末_二叉查找树_41太秀了!红黑树杀人事件始末_算法_42太秀了!红黑树杀人事件始末_二叉查找树_43太秀了!红黑树杀人事件始末_红黑树_44太秀了!红黑树杀人事件始末_算法_45太秀了!红黑树杀人事件始末_二叉查找树_46太秀了!红黑树杀人事件始末_算法_47太秀了!红黑树杀人事件始末_二叉查找树_48太秀了!红黑树杀人事件始末_算法_49太秀了!红黑树杀人事件始末_二叉查找树_50太秀了!红黑树杀人事件始末_二叉查找树_51太秀了!红黑树杀人事件始末_二叉查找树_52太秀了!红黑树杀人事件始末_二叉查找树_53太秀了!红黑树杀人事件始末_算法_54太秀了!红黑树杀人事件始末_算法_55太秀了!红黑树杀人事件始末_算法_56太秀了!红黑树杀人事件始末_二叉查找树_57太秀了!红黑树杀人事件始末_红黑树_58太秀了!红黑树杀人事件始末_红黑树_59太秀了!红黑树杀人事件始末_红黑树_60太秀了!红黑树杀人事件始末_二叉查找树_61太秀了!红黑树杀人事件始末_二叉查找树_62太秀了!红黑树杀人事件始末_红黑树_63太秀了!红黑树杀人事件始末_二叉查找树_64太秀了!红黑树杀人事件始末_算法_65太秀了!红黑树杀人事件始末_算法_66太秀了!红黑树杀人事件始末_红黑树_67太秀了!红黑树杀人事件始末_红黑树_68太秀了!红黑树杀人事件始末_红黑树_69太秀了!红黑树杀人事件始末_算法_70太秀了!红黑树杀人事件始末_算法_71太秀了!红黑树杀人事件始末_二叉查找树_72太秀了!红黑树杀人事件始末_红黑树_73太秀了!红黑树杀人事件始末_算法_74太秀了!红黑树杀人事件始末_二叉查找树_75太秀了!红黑树杀人事件始末_红黑树_76太秀了!红黑树杀人事件始末_红黑树_77太秀了!红黑树杀人事件始末_算法_78太秀了!红黑树杀人事件始末_算法_79太秀了!红黑树杀人事件始末_红黑树_80太秀了!红黑树杀人事件始末_算法_81太秀了!红黑树杀人事件始末_算法_82太秀了!红黑树杀人事件始末_二叉查找树_83太秀了!红黑树杀人事件始末_二叉查找树_84太秀了!红黑树杀人事件始末_红黑树_85太秀了!红黑树杀人事件始末_二叉查找树_86太秀了!红黑树杀人事件始末_红黑树_87太秀了!红黑树杀人事件始末_红黑树_88太秀了!红黑树杀人事件始末_算法_89太秀了!红黑树杀人事件始末_红黑树_90太秀了!红黑树杀人事件始末_二叉查找树_91太秀了!红黑树杀人事件始末_红黑树_92太秀了!红黑树杀人事件始末_算法_93太秀了!红黑树杀人事件始末_红黑树_94太秀了!红黑树杀人事件始末_二叉查找树_95太秀了!红黑树杀人事件始末_二叉查找树_96太秀了!红黑树杀人事件始末_算法_97太秀了!红黑树杀人事件始末_算法_98太秀了!红黑树杀人事件始末_算法_99太秀了!红黑树杀人事件始末_红黑树_100太秀了!红黑树杀人事件始末_红黑树_101太秀了!红黑树杀人事件始末_二叉查找树_102太秀了!红黑树杀人事件始末_二叉查找树_103太秀了!红黑树杀人事件始末_红黑树_104太秀了!红黑树杀人事件始末_红黑树_105太秀了!红黑树杀人事件始末_算法_106太秀了!红黑树杀人事件始末_二叉查找树_107太秀了!红黑树杀人事件始末_二叉查找树_108太秀了!红黑树杀人事件始末_算法_109太秀了!红黑树杀人事件始末_二叉查找树_110太秀了!红黑树杀人事件始末_红黑树_111太秀了!红黑树杀人事件始末_算法_112太秀了!红黑树杀人事件始末_算法_113太秀了!红黑树杀人事件始末_红黑树_114太秀了!红黑树杀人事件始末_红黑树_115太秀了!红黑树杀人事件始末_二叉查找树_116太秀了!红黑树杀人事件始末_算法_117太秀了!红黑树杀人事件始末_算法_118太秀了!红黑树杀人事件始末_红黑树_119太秀了!红黑树杀人事件始末_红黑树_120太秀了!红黑树杀人事件始末_二叉查找树_121太秀了!红黑树杀人事件始末_二叉查找树_122太秀了!红黑树杀人事件始末_算法_123太秀了!红黑树杀人事件始末_二叉查找树_124太秀了!红黑树杀人事件始末_算法_125太秀了!红黑树杀人事件始末_算法_126太秀了!红黑树杀人事件始末_二叉查找树_127太秀了!红黑树杀人事件始末_算法_128太秀了!红黑树杀人事件始末_二叉查找树_129太秀了!红黑树杀人事件始末_二叉查找树_130太秀了!红黑树杀人事件始末_算法_131太秀了!红黑树杀人事件始末_算法_132太秀了!红黑树杀人事件始末_二叉查找树_133太秀了!红黑树杀人事件始末_算法_134太秀了!红黑树杀人事件始末_红黑树_135太秀了!红黑树杀人事件始末_红黑树_136太秀了!红黑树杀人事件始末_红黑树_137太秀了!红黑树杀人事件始末_红黑树_138太秀了!红黑树杀人事件始末_红黑树_139太秀了!红黑树杀人事件始末_红黑树_140太秀了!红黑树杀人事件始末_算法_141太秀了!红黑树杀人事件始末_算法_142太秀了!红黑树杀人事件始末_算法_143太秀了!红黑树杀人事件始末_红黑树_144太秀了!红黑树杀人事件始末_算法_145太秀了!红黑树杀人事件始末_算法_146太秀了!红黑树杀人事件始末_算法_147太秀了!红黑树杀人事件始末_红黑树_148太秀了!红黑树杀人事件始末_算法_149太秀了!红黑树杀人事件始末_二叉查找树_150太秀了!红黑树杀人事件始末_二叉查找树_151太秀了!红黑树杀人事件始末_算法_152太秀了!红黑树杀人事件始末_二叉查找树_153太秀了!红黑树杀人事件始末_二叉查找树_154太秀了!红黑树杀人事件始末_算法_155太秀了!红黑树杀人事件始末_二叉查找树_156太秀了!红黑树杀人事件始末_二叉查找树_157太秀了!红黑树杀人事件始末_二叉查找树_158太秀了!红黑树杀人事件始末_红黑树_159太秀了!红黑树杀人事件始末_算法_160太秀了!红黑树杀人事件始末_算法_161太秀了!红黑树杀人事件始末_二叉查找树_162太秀了!红黑树杀人事件始末_二叉查找树_163太秀了!红黑树杀人事件始末_红黑树_164太秀了!红黑树杀人事件始末_二叉查找树_165太秀了!红黑树杀人事件始末_二叉查找树_166太秀了!红黑树杀人事件始末_红黑树_167太秀了!红黑树杀人事件始末_二叉查找树_168太秀了!红黑树杀人事件始末_算法_169太秀了!红黑树杀人事件始末_红黑树_170太秀了!红黑树杀人事件始末_红黑树_171太秀了!红黑树杀人事件始末_算法_172太秀了!红黑树杀人事件始末_算法_173太秀了!红黑树杀人事件始末_算法_174太秀了!红黑树杀人事件始末_算法_175太秀了!红黑树杀人事件始末_红黑树_176太秀了!红黑树杀人事件始末_算法_177太秀了!红黑树杀人事件始末_算法_178太秀了!红黑树杀人事件始末_二叉查找树_179太秀了!红黑树杀人事件始末_算法_180太秀了!红黑树杀人事件始末_算法_181太秀了!红黑树杀人事件始末_算法_182太秀了!红黑树杀人事件始末_红黑树_183太秀了!红黑树杀人事件始末_算法_184太秀了!红黑树杀人事件始末_红黑树_185太秀了!红黑树杀人事件始末_红黑树_186太秀了!红黑树杀人事件始末_红黑树_187太秀了!红黑树杀人事件始末_二叉查找树_188太秀了!红黑树杀人事件始末_二叉查找树_189太秀了!红黑树杀人事件始末_红黑树_190太秀了!红黑树杀人事件始末_算法_191太秀了!红黑树杀人事件始末_算法_192太秀了!红黑树杀人事件始末_红黑树_193太秀了!红黑树杀人事件始末_红黑树_194太秀了!红黑树杀人事件始末_二叉查找树_195太秀了!红黑树杀人事件始末_二叉查找树_196太秀了!红黑树杀人事件始末_算法_197太秀了!红黑树杀人事件始末_算法_198太秀了!红黑树杀人事件始末_红黑树_199太秀了!红黑树杀人事件始末_算法_200太秀了!红黑树杀人事件始末_二叉查找树_201太秀了!红黑树杀人事件始末_算法_202太秀了!红黑树杀人事件始末_二叉查找树_203太秀了!红黑树杀人事件始末_红黑树_204太秀了!红黑树杀人事件始末_算法_205太秀了!红黑树杀人事件始末_二叉查找树_206太秀了!红黑树杀人事件始末_二叉查找树_207太秀了!红黑树杀人事件始末_二叉查找树_208太秀了!红黑树杀人事件始末_算法_209太秀了!红黑树杀人事件始末_红黑树_210太秀了!红黑树杀人事件始末_二叉查找树_211太秀了!红黑树杀人事件始末_红黑树_212太秀了!红黑树杀人事件始末_算法_213太秀了!红黑树杀人事件始末_算法_214太秀了!红黑树杀人事件始末_红黑树_215太秀了!红黑树杀人事件始末_算法_216太秀了!红黑树杀人事件始末_红黑树_217太秀了!红黑树杀人事件始末_二叉查找树_218太秀了!红黑树杀人事件始末_二叉查找树_219太秀了!红黑树杀人事件始末_红黑树_220太秀了!红黑树杀人事件始末_算法_221太秀了!红黑树杀人事件始末_算法_222太秀了!红黑树杀人事件始末_算法_223太秀了!红黑树杀人事件始末_二叉查找树_224太秀了!红黑树杀人事件始末_算法_225太秀了!红黑树杀人事件始末_红黑树_226太秀了!红黑树杀人事件始末_红黑树_227太秀了!红黑树杀人事件始末_红黑树_228太秀了!红黑树杀人事件始末_红黑树_229太秀了!红黑树杀人事件始末_红黑树_230太秀了!红黑树杀人事件始末_红黑树_231太秀了!红黑树杀人事件始末_二叉查找树_232太秀了!红黑树杀人事件始末_红黑树_233太秀了!红黑树杀人事件始末_红黑树_234太秀了!红黑树杀人事件始末_红黑树_235太秀了!红黑树杀人事件始末_算法_236太秀了!红黑树杀人事件始末_红黑树_237太秀了!红黑树杀人事件始末_红黑树_238太秀了!红黑树杀人事件始末_算法_239太秀了!红黑树杀人事件始末_算法_240太秀了!红黑树杀人事件始末_红黑树_241太秀了!红黑树杀人事件始末_红黑树_242太秀了!红黑树杀人事件始末_算法_243太秀了!红黑树杀人事件始末_红黑树_244太秀了!红黑树杀人事件始末_二叉查找树_245太秀了!红黑树杀人事件始末_算法_246太秀了!红黑树杀人事件始末_算法_247太秀了!红黑树杀人事件始末_二叉查找树_248太秀了!红黑树杀人事件始末_算法_249太秀了!红黑树杀人事件始末_二叉查找树_250太秀了!红黑树杀人事件始末_算法_251