二叉树 平衡二叉树 B树 B+树

本文深入探讨了红黑树的概念,它介于234树和平衡二叉树之间,允许左、右子树高度差不超过2,以平衡插入和查询性能。文章介绍了红黑树的特性,包括颜色规则、平衡调整手段(变色、旋转),并强调理解红黑树需要结合234树和平衡二叉树的知识。同时,解释了为何红黑树在删除操作时的策略,以及如何通过旋转和变色保持平衡。
摘要由CSDN通过智能技术生成

最近准备开始推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.右旋:**以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变

树的旋转操作

红黑树查找:

在这里插入图片描述

插入所需平衡手段草帽和敖丙原博客讲的已经很清楚,但是删除平衡我到现在没有找到可以理解的或者很好的资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值