红黑树概述
红黑树是一种自平衡二叉搜索树,广泛应用于 C++ STL 的 map 和 set 容器。它通过颜色约束确保树的高度近似平衡,从而保证查找、插入和删除操作的时间复杂度为 O(log N)。
红黑树概念
1.1. 红黑树是什么
红黑树是一棵二叉搜索树,每个节点增加一个存储颜色的属性。节点的颜色可以是红色或黑色。通过对任何一条根到叶子的路径上各个节点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出 2 倍,因而是接近平衡的。
1.2. 红黑树的规则
- 每个节点不是黑色的就是红色的。
- 根节点必须是黑色的。
- 如果一个节点是红色的,则它的两个孩子节点必须是黑色的,即任意一条路径上不会出现连续的红色节点。
- 对于任意的一个节点,从该节点到其所有 NULL 节点的简单路径上,均包含着相同数目的黑色节点。
- 每个叶子节点(NULL)都是黑色的。
1.3. 红黑树如何确保最长路径不超过最短路径的两倍
由规则 4 可知,每条路径上有数量相同的黑色节点。在极端场景下,最短路径是全黑节点,记作 bh。根据规则 2 和 3,最长路径是一红一黑交织组成,长度为 2bh。因此,红黑树的最长路径不会是最短路径的两倍。
1.4. 红黑树的效率问题
假设红黑树的节点个数为 N,最短路径的长度为 h,可知:2^h - 1 <= N < 2^(2h) - 1,由此推出 h 大约等于 logN。红黑树的查找效率最差也是 2 * logN,时间复杂度为 O(log N)。相比 AVL 树,红黑树对平衡的把控不那么严格,插入相同数量的节点时旋转次数更少。
红黑树的实现
2.1. 红黑树的结构
红黑树节点需要包含父节点指针、左右孩子指针以及颜色属性。默认颜色为红色,通过 Key 和 Value 存放数据。
enum Colour { RED, BLACK };
template<class K, class V>
struct RBTreeNode {
pair<K, V> _kv;
RBTreeNode<K, V>* _left;
RBTreeNode<K, V>* _right;
RBTreeNode<K, V>* _parent;
Colour _col;
RBTreeNode(const pair<K, V>& kv) :_kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _col(RED) {}
};
template<class K, class V>
class RBTree {
typedef RBTreeNode<K, V> Node;
private:
Node* _root = nullptr;
};


