【算法日积月累】22-高级数据结构:红黑树

为什么要有“红黑树”

极端情况下,二叉树会退化为链表。插图,两种极端情况。

“红黑树”是一种“非严格”的平衡二叉树。

平衡二叉树的定义:任何结点的左右结点的高度差不超过 。

AVL 树是一种高度平衡的二叉树,所以查找的效率非常高,但是...但是也无法避免极端情况下时间复杂度的退化。尽管这种情况出现的...

极客时间版权所有: https://time.geekbang.org/column/article/68638#previewimg

极客时间版权所有: https://time.geekbang.org/column/article/68638#previewimg

发明人之一: Donald Knuth,现代计算机科学的前驱:《计算机编程的艺术》举世瞩目。

可以认为“红黑树”是实现上的一种表示,“红黑树”更本质上的性质是“2-3树”。“2-3 树”的理解对 B 类树(数据库)具有巨大的帮助。

“红黑树”与 “2-3 树”

红黑树是怎么来的?

《算法导论》中对于红黑树的定义。

image-20181230192256793

1、红黑树是一棵 BST 树;

为了防止一棵二分搜索树退化成链表,我们有了 AVL 树和红黑树。我们马上就会看到“红黑树”和“2-3树”是等价的,可以说“2-3树”是原型,“红黑树”是在代码实现上的一种具体方式。

“2-3树”满足二分搜索树的基本性质

2、空结点认为是黑色结点,叶子结点是空结点;

3、红色结点的孩子结点都是黑色;

4、红黑树是黑色平衡的 BST。

image-20190130161406165

认识“2-结点”、“3-结点”,看分支数,而不是看结点数。3-结点:有 3 个分支的结点是 3-结点。“2-3树”从根结点到叶子结点的路径长度是一样的,这是由“2-3树”插入结点的方式决定的。黑色平衡这个特性,要从插入结点的方式来理解。

2-3 树维持了绝对的平衡

“2-3 树”不是二叉树,但是满足 BST 的基本性质。

记住:2-3 树永远不会添加到空的结点,只会先做融合,融合以后结点个数超过 2 (从 3 开始),就要分裂,即向上传递中间结点。向上融合之后,成为结点最左边的值。直到根结点停止。

产生了结点的融合,先融合,再分裂,与它最后找到的那个叶子结点做融合。

2-3 树与红黑树的等价性

利用了每个结点只有一个父亲,这件事情,给结点增加一个颜色(红色或黑色)属性,以示区分。

所有的红结点都是左边倾斜的。

自己画一棵与 2-3 树等价的红黑树,理解。
红黑树是“黑平衡”的二叉树,即对于黑结点来说,是完美平衡的。

参考资料:红黑树
https://subetter.com/articles/rb-tree.html

维基百科中的红黑树
https://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91

25 、 红黑树(上):为什么工程中都用红黑树这种二叉树?

一、AVL 树是严格意义上的平衡二叉查找树,红黑树非严格,但是在平均意义上,动态操作的效率是最好的,所以红黑树是 BST 中的“明星树”;

补充说明:1、出现“平衡二叉查找树”就是为了避免 BST 退化成链表,而维护树的高度平衡,理想情况下,“平衡二叉查找树”的高度是 , 是树中结点的个数。

2、回顾“平衡二叉查找树”的定义:每一个结点都满足左右子树的高度差不大于 。

二、红黑树的定义

1、重点把握:黑色平衡;

即红黑树虽然不是严格意义上的高度平衡,但是它维持了黑色平衡,进而做到了“插入”“删除”“查找”操作的时间复杂度都是 。

2、红黑树比其它平衡二叉查找树有更稳定的性质。

3、看《算法4》:红黑树和 “2-3 树”的等价性,即红黑树来自“2-3 树”。

26 | 红黑树(下):掌握这些技巧,你也可以实现一个红黑树

一、实现关键点

1、任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色结点隔开的;

2、黑色平衡。

二、左旋转和右旋转

说明:理解左旋转和右旋转是非常重要的。

image-20190105120300018

三、理解红黑树很好的文章,还可以看到 B 树等

《从“2-3 树”到红黑树》

https://blog.csdn.net/fei33423/article/details/79132930

参考资料:30张图带你彻底理解红黑树:https://mp.weixin.qq.com/s/0xHEo9gzNJ31rDS3AYy11g

本文源代码

Python:代码文件夹,Java:代码文件夹。

你可能感兴趣的:(【算法日积月累】22-高级数据结构:红黑树)