红黑树
- LINDA
- 2018/9/25
前言
如果你还是对写红黑树毫无头绪,可以看一下我的思路,从普通二叉搜索树的插入操作是如何一步步“进化”为真正的红黑树的插入操作的。
红黑树的四个规则:
- (1) 每个结点要么是红的,要么是黑的;
- (2) 根结点必须为黑的;
- (3) 若结点为红,它的子节点为黑;
- (4) 从根结点到 nil 结点之间的黑结点个数相同。
由于规则 (4) ,新插入的结点必须为红。
结点的数据结构:
class rbtree {
public:
enum {
RED, BLACK};
struct node {
int val; // 插入值
int color; // 颜色
node* left; // 左子结点
node* right; // 右子结点
node(int v, int c = RED):val(v), color(c),
left(nullptr), right(nullptr) {
}
};
};
插入操作
我们从普通的二叉搜索的插入操作一步步进化成真正的红黑树插入操作:
(1) 我们先来看看普通的二叉搜索树是如何插入元素的:
class rbtree {
public:
void insert(int val) {
root = insert(root, val);
}
private:
node