前言
在学习STL的
红黑树的特性
特点
红黑树有一些几个重要特点
- 符合二叉搜索树的规律
- 所有的节点只有红色和黑色两种颜色
- 根节点是黑色
- 不存在连续的红色节点
- 每一条路径的黑色节点数目相同
- 最长路径的节点数不会超过最短路径节点数的二倍
操作与时间复杂度
- 查找:和普通的二叉查找树类似,时间复杂度为 O(logn)
- 插入:插入一个新节点后,可能会破坏红黑树的性质,需通过旋转和重新着色来恢复平衡。插入的时间复杂度为 O(logn)
- 删除:删除节点时,也需要通过调整旋转和重新着色来维护红黑树的性质,时间复杂度同样为𝑂(log𝑛)
红黑树的优势
- 相较于普通二叉查找树,红黑树在最坏情况下的时间复杂度为 O(logn),而普通二叉查找树可能退化成链表,导致查找时间复杂度为 O(n)
- 红黑树的平衡性虽然不如 AVL 树那么严格,但它的调整操作通常比 AVL 树更少,因此在插入和删除频繁的场景下,红黑树的性能往往优于 AVL 树。
红黑树的操作
插入
选择每次插入红色节点, 如果插入黑色节点, 那么必定会破坏每条路径黑色节点数目的平衡, 插入红色节点可能不会破坏平衡, 并且即使破坏平衡, 也可以通过变色或旋转调整
不破坏平衡插入
比如在下面红黑树插入一个2
插入后没有破坏红黑树的平衡
破坏平衡&叔叔节点为红色
比如
插入后
破坏了平衡, 不能有连续的红色节点, 这种情况就需要变色处理
将父节点和叔节点变成黑色, 爷节点变成红色
这时, 又破坏了根节点为黑色的规则, 我们再把根节点变黑
多次调整情况
插入后破坏平衡
第一次调整变色
现在中间也破坏平衡, 继续调整, 这次就属于下面一种情况, 下面再细说
破坏平衡&叔叔节点不存在或为黑色
LL型
插入后破坏平衡
进行右旋操作
然后将原本的爷节点变红, 父节点变黑
RR型
比如
进行左旋并变色
LR型
比如
先对父节点进行左旋操作
再对爷节点进行右旋变色操作
RL型
比如
先右旋再左旋变色
完整插入演示
[17,18,23,34,27,15,9,6,8,5,25]
插入17
插入18
插入23 破坏规则
左旋变色调整
插入34 破坏规则
变色调整
插入27 破坏规则
先右旋再左旋变色调整
插入 15
插入9 破坏规则
右旋变色调整
插入6 破坏规则
变色调整
插入8 破坏规则
先左旋再右旋变色调整
插入5 破坏规则
变色调整
继续向上调整, 右旋变色调整
插入25 破坏规则
变色调整
继续向上变色调整
调整根节点