红黑树杀人事件始末
The following article is from 码海 Author 郭可岩
前言
红黑树是工程中最常见的二叉查找树的实现,例如在 Linux 的内存管理和进程管理中就用到了红黑树;Java 语言的集合包、C++语言的标准模板库中均提供了红黑树的实现类。
红黑树本身的设计很复杂,多数情况下我们也不需要自己去实现红黑树,但研究红黑树还是有意义的。一方面可以让学习者领略这种神奇的数据结构的奥妙,另一方面可以作为一种思维训练工具,提升自己的算法设计能力。
本文以漫画形式讲述红黑树,第一话讲解二叉查找树的概念和基本操作,包括节点查找、插入、删除;第二话讲解二叉查找树的缺点和红黑树的概念,以及红黑树的节点旋转操作;第三话讲解红黑树的节点插入操作;第四话讲解红黑树的节点删除操作;第五话和彩蛋部分讲解红黑树在插入修正和删除修正时,对各种 CASE 所进行的调整操作背后的思想。
红黑树的实现中,最难的部分在于实现节点的插入和删除时,要穷举所有可能的 CASE,然后对每种 CASE 进行处理。在理解节点的插入和删除的过程时,读者要把握住一个中心:每种 CASE 所进行的调整步骤都在尽量恢复插入/删除节点后所违反的红黑树特性,如果当前 CASE 解决不了,就转成另一种更接近问题解决状态的 CASE。每种 CASE 的所进行的调整步骤都是为了向解决问题的出口更靠近一步,直至找到出口。
漫画采用大量的图示来展示红黑树操作的诸多细节,作者力求详尽,因此篇幅略长。在 PDF 中给出了完整的二叉查找树定义 + 测试代码,以及红黑树定义 + 测试代码。两份代码均经过了若干次十万数量级随机节点插入和删除测试,结果均无误。读者可贴到自己的 IDE 中,结合本文讲解进行调试研究。
在电脑端本文阅读效果更佳。另外,读者可联系码海公众号博主(微信:geekoftaste)获取本漫画的完整 PDF 版本
正文
推荐阅读
哈哈哈,发年终奖啦,我要去斗鱼打赏最喜欢的妹子~
加入字节跳动 455 天,谈一谈我的感受
HR 给 15 k,我如何谈到 25 k?
加班加到黑的日子,字节跳动终于要1075啦
内推字节 Linux C/C++ 开发的那位同学没通过面试...
Java 为什么不采用 360 垃圾清理来进行垃圾回收呢?
后端进阶神速社区,看这里
工作多年,那些曾经帮我成长的开源 C++ 项目、学习方法,现在全部分享给你
往期精华文章汇总
一大波游戏源码分享
如果对后端开发感兴趣,想加入 高性能服务器开发微信交流群 进行交流,可以先加我微信 easy_coder,备注"加微信群",我拉你入群,备注不对不加哦。
点亮,服务器三年不宕机