红黑树及其插入和删除
红黑树及其插入和删除
红黑树是一种自平衡二叉查找树,在计算机科学中被广泛应用于各种数据结构的实现,如C++标准模板库中的map和set。它通过特定的着色规则和旋转操作来保持树的平衡,从而确保基本操作(如插入、删除和查找)的时间复杂度为O(log n)。本文将详细介绍红黑树的定义、性质以及插入和删除操作的具体步骤,并与AVL树进行比较。
定义
- 每个节点非红即黑
- 根节点是黑色
- 红色节点不能连续(红色节点的子节点和父节点不能是红色)
- 任意节点到其任何一个叶子节点所经过的黑色节点数量都相同
- 所有的叶子节点(外部节点,NULL 节点, 失败节点)都是黑色的
- 红黑树是二叉排序树,满足,左<根<右
口诀速记:
左根右 根叶黑
不红红 黑路同
enum Color { RED, BLACK };
template <typename T>
struct Node {
T data; // 存储节点数据,这里假设模板类型T为存储的数据类型
Color color; // 标识节点颜色
Node* left; // 指向左子节点
Node* right; // 指向右子节点
Node* parent; // 指向父节点
};
注: 叶节点实际指的是失败的节点!
黑高 bh :
红黑树的黑高是指树中任意节点出发到叶子节点路径上黑色节点的数量(不包括任意节点本身)。
性质
- 从根节点到叶节点的最长路径的长度不大于最短路径长度的 2 倍 (不红红+黑路同,保证了最长路径只能是红色穿插在黑色之间)
- 有 n 个内部节点的红黑树的高度 h<=2l o g 2 ( n + 1 ) log_2 (n+1)log2 (n+1)
所以红黑树的查找效率为 O(l o g 2 n log_2 nlog2 n)
红黑树的插入
红叔
叔父&爷色对调
爷视为新节点
(若此时爷是跟节点直接爷节点变黑)
黑叔
爷父孙调整(按照 BST 左根右性质)
原先的爷夫孙形成了三角形,有了新的根节点
新的根节点原先的左孩子变左孩子的孩子
新的根节点原先的右孩子变右孩子的孩子
红黑树的删除
只有左孩子 / 只有右孩子
- 操作:代替后变黑(待删除结点的孩子代替它过来后 变黑)
没有孩子
- 待删除结点:红结点
- 删除后无需任何调整
- 待删除结点:黑结点(删除后变双黑)
- 若兄弟是黑色
- 若兄弟至少有一个红孩子(LL, RR, LR, RL)
- 变色 + 旋转(双黑变单黑)
(变色: s 是 simbling 兄弟,p 是 parent 父母,r 是 red s 的红结点 - LL, RR 是 r 变 s, s 变 p, p 变黑
- RL, LR 是 r 变 p, p 变黑 )
- 若兄弟的孩子都是黑色
- 操作:兄弟变红,双黑上移(遇红或根变单黑)
- 若兄弟是红色
- 父结点变色,朝双黑旋转(保持双黑继续调整)
红黑树 AVL 的比较
操作 红黑树(时间复杂度) AVL 树(时间复杂度)
删除 O (log n) O (log n)
搜索 O (log n) O (log n)
最大值查找 O (log n) O (log n)
最小值查找 O (log n) O (log n)
顺序查找前驱/后继 O (log n) O (log n)
逻辑对比
我 : 红黑树和 AVL 在查找的逻辑上相比差距在哪
Z : 红黑树和AVL树都是自平衡的二叉搜索树,它们在查找操作上的逻辑基本相同,因为它们都维持了二叉搜索树的性质:任何一个节点的左子树都只包含比当前节点小的元素,而右子树只包含比当前节点大的元素。这两种树在查找上的效率都是O(log n)。
但是,它们在自平衡的机制上有所不同,这导致了它们在执行查找操作时的一些差异:
平衡的准则:
AVL树:AVL树使用的是严格的平衡条件,即任何一个节点的左右子树的高度差(平衡因子)最多为1。这种严格的平衡保证了树的高度最小化,从而查找效率更加稳定。
红黑树:红黑树使用的是相对宽泛的平衡条件。它通过确保树中任意节点到其任何后代叶子节点的所有路径上的黑色节点数目相同(即黑高相同),以及遵守红黑性质(每个节点是红色或黑色;根节点是黑色;所有叶子节点是黑色;如果一个节点是红色,则它的两个子节点都是黑色;从任意节点到其每个叶子的所有路径都包含相同数目的黑色节点)来保持平衡。
旋转操作:
AVL树:当插入或删除节点导致树不平衡时,AVL树会进行“单旋转”或“双旋转”来重新平衡树。这些旋转操作可能涉及两次或三次的节点移动。
红黑树:红黑树通过重新着色和旋转(左旋转、右旋转)来保持平衡。虽然旋转操作和AVL树类似,但红黑树更可能进行的是红黑性质的调整,如改变节点颜色和进行旋转。
在查找上的逻辑差距:
查找效率的稳定性:由于AVL树维持了严格的平衡,它保证了最坏情况下查找的时间复杂度仍然是O(log n)。而红黑树虽然平均查找长度近似O(log n),但理论上可能因为黑高的变化导致最坏情况下的查找时间复杂度稍高。
操作的复杂性:红黑树的自平衡操作(重着色和旋转)相对AVL树来说更为复杂,但由于其相对宽松的平衡条件,插入和删除操作可能更容易实现。