一、红黑树
引言
我们知道平衡二叉树(AVLTree),在查找、插入和删除在平均和最坏情况下平均时间复杂度都是
平衡二叉树效率高就是在这个地方,但是当左右子树高度差大于1时,AVL树的平衡状态被打破,那么需要有个自平衡的过程(LL,RR,LR,RL)。因为AVL树有*严格的高度差限制条件*,若插入删除操作频繁破坏树的平衡条件,那么也会频繁出现自平衡过程,自平衡也是需要时间开销的(例如平衡度计算的时间开销)。为了放宽限制条件,但依然保持树是平衡二叉树(这里放宽了高度差的条件),所以提出了红黑树,实际上红黑树在树的高度差上没有AVL树那么严格,自然红黑树在插入删除操作频率会更低。
红黑树的五大特点(必须满足)
- ① 结点是红色或者黑色(以直观图表示。若用代码,在构建数据结构时只需要定义变量color,例如color=1代表红色,0代表黑色)
- ② 根结点是黑色
- ③ 每个叶结点都是黑色的空结点(NIL结点,失败结点)
- ④ 红色结点的父子结点都是黑色的(不存在相邻的两个父结点)
- ⑤ 从任一结点到其每个叶结点的所有路径都包含相同数目的黑色结点。这个黑色结点的数目(不包含出发结点)为黑高(black-height,用bh(x)表示,红黑树的黑高为根结点的黑高)
图上为一颗红黑树,大家可以罗列下这棵树满足的上面五大特点。NIL结点即叶结点称为外部结点(n+1),其余结点为内部结点(n)。NIL结点的采用使得每个内部结点左右孩子非空,有利于红黑树的实现。
红黑树的性质
- 路径约束:任何一条从根到叶结点的简单路径上,最长路径不大于最短路径的2倍 (约束①②④可得出,记住就行)
如上图根节点开始到叶结点(这里只呈现内部结点),根节点的左右子树高度是两倍的关系,再插入2结点,破坏了约束,导致自平衡
- 高度约束: n个内部结点的红黑树的高度H满足下式 (根据上结论与约束⑤得出,任何一条简单路径上至少有一半是黑结点,根黑高至少为H/2)
再变化一下:
插入
新插入结点颜色为红色。PS:如果为黑色那么新插入结点所在路径多了个黑结点(破坏规则⑤),这样调整的代价更大了。
& 为便于更好理解插入原则,下图我们定义了几个节点的关系图
插入操作可分两大类情况:
㈠ 叔叔黑色(旋转 + 变色)
·旋转和AVL数类似--
LL 右单旋 父爷变色
RR 左单旋 父爷变色
LR 左右双旋 儿爷变色
RL 右左双旋 儿爷变色
㈡ 叔叔红色(变色)
·叔父爷变色 爷根再变色
☆ 前提情况一:新插入结点在未调整下的叔叔结点为 黑色
❶LL 右单旋 父爷变色(依次插入22 18 11)
PS:插入结点若为根节点,直接黑色,其余插入结点都为初始时***红色***。
解释一下:先将儿父爷进行右单旋转,然后父爷结点颜色——红=>黑,黑=>红。
我们可以看到结点11的爷爷是结点22,22结点的NULL结点即为11的黑叔叔。
❷ RR 左单旋 父爷变色(插入22 18 11 28 37)
PS:其中插入28有一次颜色变化,我们在前提情况二讲
❸LR 左右双旋 儿爷变色(插入22 18 11 28 37 5 8)
PS:先儿父左旋,再儿父爷右旋,最后儿子和爷爷颜色变色
❹ RL 右左双旋 儿爷变色 (插入22 18 11 28 37 5 8 25 23)
PS:其中插入25有一次颜色变化,我们在前提情况二讲
☆ 前提情况二:新插入结点在未调整下的叔叔结点为 红色
这种情况只需要换色,不需要旋转。
规则:叔父爷换色,爷根再变色。
可以看到当结点28插入时,它的叔叔结点11是红色,此时11叔叔、22爸爸、18爷爷同时变色,但由于爷爷18是根节点,只能是黑色,然后爷爷根再变色(变黑就行)。
这种情况下插入25时,其叔叔为红,爷爷不为根,只需要叔父爷同时变色即可
查找
这个和二叉排序树、AVL树的查找方式类似的。
- 查找成功 Search: 25
- 查找失败 Search: 24(查到NULL结点 [NIL] 就失败)
删除
删除操作相对于来说是比较麻烦的,大家可以参考其他大佬的文章。(针对这次考研,第一次加入红黑树,我猜删除的要求不会很高。)
推荐几篇大佬的文章供大家参考
[]: www.jianshu.com/p/84416644c… "删除:推荐文章一"
[]: blog.csdn.net/qq_32924343… "删除:推荐文章二"
☆ 重要结论(记住即可):
由此可见:红黑树的插入最多旋转两次,删除最多旋转三次
总结
- 红黑树相比于AVL树,牺牲了部分平衡性,以换取删除/插入操作时少量的旋转次数,整体来说,性能优于AVL树
- 红黑树的插入/删除操作自平衡旋转的次数都是常数级的
- 对于AVL树和红黑树,前者更适合多查找场景,后者更适合多增删场景
| 时间复杂度O\树 | BST 二叉搜索树 | AVL 平衡二叉树 | RBT 红黑树 |
|---|---|---|---|
| 查 | O(n) | O() | O() |
| 插 | O(n) | O() | O() |
| 删 | O(n) | O() | O() |
注意:红黑树在删除操作时结点旋转次数是常数级的,而AVL树是O()。综合考虑,红黑树统计性能比AVL好。
二、考研模拟练习题
1、下列关于红黑树的说法正确的是:
A. 红黑树本质上是一棵二叉树
B. 红黑树适合于增删多而查询少的场景
C. 红黑树的查询时间复杂度是
D. 在红黑树中,新添的节点的颜色可以是黑色的
2、关于红黑树,以下哪种说法是不正确的?
A. 一棵含有n个节点的红黑树的高度至多为
B. 如果一个节点是红色的,则它的子节点必须是黑色的
C. 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
D. 红黑树的查询效率一般要优于含有相同节点的AVL树(平衡二叉树)
3、下面关于红黑树说法正确的是()
A、高度为h的红黑树,它的包含的内节点个数至少为个
B、红黑树在进行插入和删除操作时,时间复杂度都为
C、红黑树在进行插入和删除操作时,从不平衡状态到平衡状态最多需要三次旋转
D、红黑树和AVL树都是自平衡二叉树
4、下列说法错误的是()
A、若一棵红黑树不存在两个相连的红结点
B、红黑树中,红结点的数量不会超过内部结点总数的一半
C、红黑树和AVL树的查找、插入、删除操作的最坏时间复杂度都相同
D、红黑树常用于Linux中进程的调度
5、利用红黑树依次插入22 18 11 28 37 结点后的图,并说明自平衡调整过程
答案
1、A
这题注意下B,红黑树从插删查来看,自身当然是更适合搜索。如果AVL树和红黑树对比,那么红黑树适合于增删多而查询少的场景。
2、D
拓展:若根节点黑高为h,内部结点数最多有 -1 个
3、C
C选项错,由于插入操作最多进行两次旋转
4、B
B主要错在,从整棵树看是有可能红数量大于黑数量,但从根结点起的任意一条路径上红数量不会超过路径内部结点量的一半
例如下图:内部结点黑色1个,红色2个
拓展:B+树常用于数据库索引
5、答案就是上面的插入的动图哈。
祝大家考研顺利,祝自己也是嘿嘿!!!
因为自己也是边学边记录,如有错误万分感谢指出。 2021/12/05 BY 壹加柒