红黑树这样学才对!

红黑树竟然还能这样学?以前的感觉都白看了

​ 红黑树其实并不神秘,如果你看过我上一篇文章,并且知道4阶B树的性质的话,那么我相信,通过本篇文章,你肯定能知道什么是红黑树。

​ 为了能够将的更通俗易懂,所以分成两篇来讲,在上一篇文章中我大概介绍了一下树这一数据结构的发展历程,都是在为学习红黑树作为铺垫,这里有传送门:https://blog.csdn.net/weixin_44829930/article/details/111658813(强烈建议:在学红黑树之前需要掌握好这些内容)

为什么要有红黑树?

​ 回顾上一篇说到的AVL树,它查找到某个元素是非常之快的,时间复杂度是Log(n)级别,但最大的缺点是,最多时需要进行Log(n)次的调整,目的是为了维持左右子树高度差不超过1这一性质,这个性质虽然使得AVL树表现得非常平衡,但是因为每次都需要进行调整,这正是保持平衡而付出的性能方面的代价,因为样的取舍在某些场景下还是会有瑕疵,因此诞生出了红黑树这一比较受欢迎的树,应用于很多领域,比如HashMap底层。你可以将它理解为它相对于AVL树是牺牲了一小部分平衡性的,因此它的综合性也能要强于AVL树

红黑树是什么?

​ 这里在介绍之前是默认你是知道4阶B树的。好了,正题开始!

​ 先给大家看一下一般的红黑树的样子

在这里插入图片描述

​ 是不是看上去一脸懵呢?如果是的话那就对了。为了让你能够看得懂一些,我再告诉你一些它的一些性质:

  1. 节点必须是 红色的 或者 黑色的

  2. 根节点是黑色的

  3. 叶子节点(空节点)都是黑色的

  4. 红色节点的子节点都是黑色的

    红色节点的父节点都是黑色的

    从根节点到叶子节点的任意一条路径都不能有2个连续的红色节点

  5. 任意节点到叶子节点所有的路径都包含相同数目的黑色节点

看完了上面的型之后,是不是还是有点懵?没关系,我们用我们熟悉的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)次旋转调整

可能表中的对比看着不是非常的明显,我们进一步来分析一下:

  1. AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。

  2. 如果插入一个node引起了树的不平衡,AVL和RB-Tree都是最多只需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root这条路径上所有node的平衡性,因此需要旋转的量级O(logN),而RB-Tree最多只需3次旋转,只需要O(1)的复杂度。

  3. 因为AVL树平衡性最好,因此在插入元素相同的情况下,树的高度一定是AVL树最矮,因此,如果搜索的次数远远大于插入和删除的次数,那么就选用AVL树,反之选用红黑树

总结

在插入元素相同的情况下,树的高度一定是AVL树最矮,因此,如果搜索的次数远远大于插入和删除的次数,那么就选用AVL树,反之选用红黑树

猜你喜欢

转载自blog.csdn.net/weixin_44829930/article/details/111771454