红黑树竟然还能这样学?以前的感觉都白看了
红黑树其实并不神秘,如果你看过我上一篇文章,并且知道4阶B树的性质的话,那么我相信,通过本篇文章,你肯定能知道什么是红黑树。
为了能够将的更通俗易懂,所以分成两篇来讲,在上一篇文章中我大概介绍了一下树这一数据结构的发展历程,都是在为学习红黑树作为铺垫,这里有传送门:https://blog.csdn.net/weixin_44829930/article/details/111658813(强烈建议:在学红黑树之前需要掌握好这些内容)
为什么要有红黑树?
回顾上一篇说到的AVL树,它查找到某个元素是非常之快的,时间复杂度是Log(n)级别,但最大的缺点是,最多时需要进行Log(n)次的调整,目的是为了维持左右子树高度差不超过1
这一性质,这个性质虽然使得AVL树表现得非常平衡,但是因为每次都需要进行调整,这正是保持平衡而付出的性能方面的代价,因为样的取舍在某些场景下还是会有瑕疵,因此诞生出了红黑树这一比较受欢迎的树,应用于很多领域,比如HashMap底层。你可以将它理解为它相对于AVL树是牺牲了一小部分平衡性的,因此它的综合性也能要强于AVL树
。
红黑树是什么?
这里在介绍之前是默认你是知道4阶B树的。好了,正题开始!
先给大家看一下一般的红黑树的样子
是不是看上去一脸懵呢?如果是的话那就对了。为了让你能够看得懂一些,我再告诉你一些它的一些性质:
-
节点必须是
红色的
或者黑色的
-
根节点
是黑色的 -
叶子节点(
空节点
)都是黑色的 -
红色节点的
子节点
都是黑色的红色节点的
父节点
都是黑色的从根节点到叶子节点的任意一条路径都不能有2个连续的红色节点
-
任意节点到叶子节点所有的路径都包含相同数目的黑色节点
看完了上面的型之后,是不是还是有点懵?没关系,我们用我们熟悉的4阶B树来对比看一下:
是不是不明显?那我给你变形一下,
就像下面这个样子:
是不是发现了什么规律了?看到这里我猜你应该能明白我在上一篇文章中为什么要说B树了吧。其实,如果你换一个角度来看红黑树:将红色子节点与其父节点进行合并后看成4阶B树中的一个节点,那么之后的学习过程中,你完全可以当做是在学B树,因为红黑树的性质和4阶B树是等价的
-
小结
在将红黑树进行变形之后,想必你应该可以看出来,它非常的矮,换言之也就是比较平衡,但是在变形之前,也可以看得出,他没有AVL树那么平衡。
红黑树的性能如何呢?
首先,这里就先不详细展开红黑树具体的增删操作了,大家可以自行在网上找一片专门讲红黑树增删过程的学习一下(在这里提示一点:其实和B树是一模一样的的,所以只需要学一下B树的增删操作后即可快速学会红黑树的增删操作),本文主要目的是想告诉你的是怎样去学红黑树,而不是红黑树的具体内容
性能对比:
对比的指标 | AVL树 | 红黑树 |
---|---|---|
平衡性 | 最严格 | 相对宽松一些 |
添加 | O(logn)次查找 + O(logn)次旋转调整 |
O(logn)次查找 + O(1)次旋转调整 |
删除 | O(logn)次查找 + O(1)次旋转调整 |
O(logn)次查找 + O(1)次旋转调整 |
可能表中的对比看着不是非常的明显,我们进一步来分析一下:
-
AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。
-
如果插入一个node引起了树的不平衡,AVL和RB-Tree都是最多只需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root这条路径上所有node的平衡性,因此需要旋转的量级O(logN),
而RB-Tree最多只需3次旋转
,只需要O(1)的复杂度。 -
因为AVL树平衡性最好,因此在插入元素相同的情况下,树的高度一定是AVL树最矮,因此,如果搜索的次数远远大于插入和删除的次数,那么就选用AVL树,反之选用红黑树
总结
在插入元素相同的情况下,树的高度一定是AVL树最矮,因此,如果搜索的次数远远大于插入和删除的次数,那么就选用AVL树,反之选用红黑树