0
点赞
收藏
分享

微信扫一扫

红黑树(RBT)

苦茶如歌 2022-03-30 阅读 34
算法

1. 红黑树简介

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。
在这里插入图片描述
说到这可能还是存在一些疑惑,我们已经学了二叉排序树,为什么还要引入红黑树呢?其实,C++的map 和 set 的底层就是用红黑树实现的。以查找为例,虽然红黑树和二叉排序树平均时间复杂度为O(logN),但是红黑树最坏时间复杂度为O(2lgN) (最坏情况:恰好红黑交替),但二叉排序树最坏时间复杂度为O(N) (一边倒),如下图:
在这里插入图片描述
可能有的uu又有疑惑了: 那平衡二叉树最坏情况下也是O(lgN)啊,为什么用RBT呢?AVL树(平衡二叉树)是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。这就会导致每次插入的时候有很大的工作量。而红黑树对平衡的要求较低,最大能容忍两棵子树长度差1倍(全黑 & 红黑恰好交替),这就大大减少了插入删除的工作量,因此引入红黑树是很有必要的。

2. 红黑树特性

在这里插入图片描述

(1)每个结点的颜色只能是红色或黑色。
(2)根结点是黑色的。
(3)每个叶子结点都带有两个空的黑色结点(哨兵),如果一个结点n只有一个左孩子,那么n的右孩子是一个黑哨兵;如果结点n只有一个右孩子,那么n的左孩子是一个黑哨兵。
(4)如果一个结点是红的,则它的两个儿子都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
(5)对于每个结点来说,从该结点到其子孙叶结点的所有路径上包含相同数目的黑结点。

3. 红黑树的插入

网上对红黑树的插入感觉说的鱼龙混杂,甚至有些分类方法是错误的。我个人觉得下面这个图,非常直观易懂:
在这里插入图片描述
(未完待续····)

举报

相关推荐

0 条评论