最近准备开始推HashMap源码,先去了解下二叉树 B树和红黑树的概念
https://mp.weixin.qq.com/s/HSp1gZr55DX3ErRw0du1aw(各种概念介绍)
平衡二叉树详解 - zhangbaochong - 博客园 (cnblogs.com) 专门介绍平衡二叉树
https://blog.csdn.net/XiaoGong1688/article/details/100150759(B-树 B+树效率区别)
https://blog.csdn.net/qq_35190492/article/details/109503539(红黑树,建议先看这篇,敖丙大佬的作品)
https://csp1999.blog.csdn.net/article/details/109580974 草帽手写红黑树的博客,建议上面博客通读,尤其敖丙的看完之后,再去作了解
顺带说下,这篇博客类似笔记,会不定时添加新内容
如果你已经看完了二叉树和平衡二叉树的定义,结合敖丙大佬的博客,红黑树其实不难理解,当然多看几遍是很必要了,他的博客我看了几十遍···
补充几个在阅读敖丙博客时候可能产生的疑问的答案吧,也不至于再去花费时间精力去做类似读书笔记一样的东西,反正有大佬现成的文章,拿过来看就是了。
1 为什么以23树 或者234树为模型的红黑树实现中,四节点必须是一黑二红,且父节点必为黑,而两个儿子节点分别为左右两个红色,而不能在一侧出现连续红节点
答:四节点中最多三个元素,根据平衡二叉树的定义(它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树),如果出现一侧的连续红节点,四节点本身就不平衡,而是出现了退化成链表的情况
2为什么演示中的红黑树的删除选择了右子树的最左边节点
答:平衡二叉树的删除策略是什么?
平衡二叉树详解 - zhangbaochong - 博客园 (cnblogs.com)
右子树的所有元素均大于当前节点,右子树中的最左节点是右子树的中的最小元素,它依然大于当前节点元素,所以删除当前节点,变成了删除它,然后将它所包含的元素2塞进当前节点
3 红黑树是否是平衡二叉树
答:(摘自百度)红黑树属于平衡二叉树。
说它不严格是因为它不是严格控制左、右子树高度或节点数之差小于等于1。
但红黑树高度依然是平均log(n),且最坏情况高度不会超过2log(n),这有数学证明。所以它算平衡树,只是不严格。不过严格与否并不影响数据结构的复杂度。
4 为什么23树的删除演示的情况3中会合成一个临时四节点?
答:不合并符合23树特征,因为3阶的b树允许节点有三个子节点,没有问题
但是当我们将23树和红黑树联系到一起思考,红黑树是二叉树,换成红黑树思考,如果不合成临时四节点,是不是相当于包含17的这个二节点下有三个二节点(三个黑节点)?二叉树节点怎么有三个子节点?但如果合成临时四节点,删除元素后的三节点就可以表示成左倾红节点的结构,这样是不是想得通了
二叉查找树在插入数据有序的时候 比如 0 1 2 3 4 5 6 7 8 9这样的数据,回导致数据都处在根节点的左 或者右子树,最终结果就是树结构退化成链表,查找效率大幅度降低,理论上它是符合二分法复杂度的,也就是O(log(N)),但是实际上,当它退化成链表时,复杂度将降级成O(N)
而平衡二叉树,通过限制左右子树高度差绝对值不能大于1,且这个规则在左子树 右子树的子树中都成立的限制下,避免了退化成链表的悲剧,通过树的旋转来维持树的平衡。
那为什么还要有红黑树的引入呢?平衡二叉树确实做到了查找符合二分法的算法复杂度,然而其平衡需求也成了一种限制,在插入 删除 查询都多的场景下,需要不停的进行左右旋转以维持平衡,查询效率是上去了,但是整体性能依旧不算太理想。
所有,有了红黑树这个说法,它是一种对于23 234B树的一种概念实现,234树本身是一种平衡树,其平衡是依赖节点的分裂实现数据均匀分布,如果光看红黑树黑色节点,它符合平衡二叉树的平衡要求,而当你将红节点和黑节点结合起来,你又会发现它符合234树的平衡要求,这就是黑色完美平衡的说法来源。
234B树的查找效率是高于链表的,平衡二叉树自然高于二叉树高于链表,作为在234树和平衡二叉树中间一种折中的选择,红黑树以均衡插入数据和查找数据效率的方式出现了
总结一下它的特征 插入 删除 的场景,我们来模仿一下前人的脚步,手动实现一个红黑树
1 红黑树的特点
1.1 每个节点要么是黑色,要么是红色。
1.2 根节点是黑色。
1.3 每个叶子节点(NIL)是黑色。
1.4每个红色节点的两个子节点一定都是黑色。不能有两个红色节点相连。
1.5 任意一节点到每个叶子节点的路径都包含数量相同的黑结点。俗称:黑高!
第一条没什么好说的
第二条 在23树和234树中,2节点在红黑树的表示就是黑色的,根节点只有一个元素,必为黑
第三条 红黑树本身是黑色完美平衡,为了维持子树之中的平衡,我们为单子树或者无子树的节点如上图 7 8 25 30添加黑色的空引用节点,不管他们本身是红是黑,子节点为黑不会违背第四条定义(不会出现连续红节点),我觉得这些空叶子节点还有另一个作用,就是告诉你,数据到此为止,后面的没有了
第四条 无论23树 234树,2节点 3节点表示的是左右倾红节点 和双红子节点,父节点都是黑的,所以连续红节点是不合理的
第五条 结合上面的属性,得出第五条结论
小结:红黑树不是完美平衡的二叉树,是允许左右子树高度差绝对值大于1的,结合23 234树和平衡树的概念去理解红黑树的这些定义,就能“生动”地理解这些定义了,不要去死记硬背,硬背下来地东西容易遗忘
梳理完了特点之后,我们总结一下红黑树 删除 插入地调平场景,这里参考了草帽大佬的博客,我比较懒,也不够熟悉,就先学习下
2 红黑树查找和调平的手段
**1.变色:**结点的颜色由红变黑或由黑变红。
**2.左旋:**以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。
**3.右旋:**以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变
红黑树查找:
插入所需平衡手段草帽和敖丙原博客讲的已经很清楚,但是删除平衡我到现在没有找到可以理解的或者很好的资料