从这篇文章开始我们来介绍红黑树这种数据结构,由于红黑树有二分搜索树和AVL树的性质,对于红黑树的操作同样依赖于这些性质。所以,如果理解了二分搜索树和AVL树之后再来理解红黑树其实相对来讲还是比较简单的。
红黑树是由Robert Sedgewick发明的,你如果不知道Robert是谁,网上很多文章都推荐一本书叫《算法4》,这本书就是Robert写的。如果你不知道《算法4》这本书,那你一定知道 Donald Knuth(中文名叫唐纳德),如果你连唐纳德也不知道那就应该去补补课了。可以说,如果没有唐纳德我们就没有衡量数据结构算法性能的方法,相应的我们也就没有提升算法性能的依据了,这就相当于是现实世界没有了尺子和秤,对于计算机科学的重要性不言而喻。他写过一套书叫《The Art of Computer Programming》 中文叫《计算机编程的艺术》。没错,微软在最鼎盛时期,比尔盖茨说读了这本书,并且读懂了,你可以把简历直接发给比尔盖茨。
我第一次去认真学习红黑树是看《算法导论》但当时备受打击,我给你看一下算法导论对红黑树的说明你就知道了。 一棵红黑树是满足下面红黑性质的二叉搜索树 1. 每个节点或是红色的,或是黑色的 2. 根节点是黑色的 3. 每个叶结点(NIL)是黑色的 4. 如果一个节点是红色的,则它的两个子节点都是黑色的 5. 对每个节点,从该节点到其所有子节点的简点路径上,均包含相同数量的黑色节点 如果第一次看到这5条性质,相信大部分人和我一样是有点蒙的,个人觉得对于红黑树的讲解比较好的还是《算法4》这本书。可能跟作者是红黑树的发明者有关系吧。
这篇文章我们最终就是要把红黑树的这几条性质搞明白。但如果直接上来就讲红黑树还是有些吃力。所以,我们从另一种树结构,2-3树作为切入点。
什么是2-3树
2-3树的特点是同一个节点可以保存一个元素,也可以保存两个元素,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/79ef0637128f9ccf5da633dc0b708983.png)
对于一颗2-3树,节点可以有1个元素或者2个元素,如果节点只有1个元素,其最多只有两个子节点,左子节点比当前节点小,右子节点比当前节点大。如果一个节点有两个元素,左子节点比小的那个元素小,右子节点比大的那个元素大,中间的子节点介于两个元素之间。最后,对一颗2-3树一定是一颗绝对平衡树,也就是平衡因子为0,回忆一下我们讲AVL树的时候对平衡因子的说明,我们说对于任一节点,其平衡因子等于左子树和右子树的层高差。
C/C++Linux服务器开发高级架构师/C++后台开发架构师免费学习地址
【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以自行添加:Q群:720209036 点击加入~ 群文件共享
![](https://i-blog.csdnimg.cn/blog_migrate/a9d5e5be8b5bdfccc6413d54bd8a617b.png)
2-3树插入节点
2-3树节点的插入,主要还是在于维护树的绝对平衡性质,同时又不破坏2-3树的性质,下面我们通过画图的方式推演一遍2-3树插入的过程。
![](https://i-blog.csdnimg.cn/blog_migrate/b29a21adda502e6811389385d2cc87f4.png)
在一开始,2-3树只有一个节点42,我们插入一个节点37,最终结果37和42融合成为了一个三节点。\
![](https://i-blog.csdnimg.cn/blog_migrate/5346521a528ff32287c5d38ef0205a0b.png)
插入一个节点12, 将12,37,42融合成一个4节点,但4节点明显不符合2-3树的性质。所以,我们将37抽出来融合成一个2节点,完成节点12的插入。
![](https://i-blog.csdnimg.cn/blog_migrate/1e9737444f2ddc9505dbeb7d7d31c95b.png)
插入节点18, 将12和18融合成一个3节点,完成节点18的插入操作。