未完待续...
参考:https://www.jianshu.com/p/84416644c080
参考:零声学院课程
原理
红黑树 https://en.wikipedia.org/wiki/Red%E2%80%93black_tree
左倾红黑树 https://en.wikipedia.org/wiki/Left-leaning_red%E2%80%93black_tree
插入的三种情况
注意需要说明的是,写代码一般是将情况三转换为情况二(以B为中心,左旋)
删除的四种情况(只涉及删除黑节点的情况,其他情况很简单的)
注意需要说明的是,写代码一般是将情况二转换为情况三(以B为中心,右旋)
代码
#include <stdio.h>
#include <stdlib.h>
//https://www.jianshu.com/p/84416644c080
// 1. 每个结点是红的或者黑的
// 2. 根结点是黑的 !!!
// 3. 每个叶子结点是黑的
// 4. 如果一个结点是红的,则它的两个儿子都是黑的 !!!
// 5. 对每个结点,从该结点到其子孙结点的所有路径上的
// 包含相同数目的黑结点
#define RED 1
#define BLACK 2
typedef int KEY_VALUE;
#define RBTREE_ENTRY(name, type)\
struct name{ \
unsigned char color; \
struct type *left; \
struct type *right; \
struct type *parent; \
}
struct rbtree_node{
RBTREE_ENTRY(,rbtree_node) rbt;
KEY_VALUE key;
};
typedef struct{
struct rbtree_node *root;
struct rbtree_node *nil;
}rbtree;
rbtree* rbtree_create(){
rbtree* T = malloc(sizeof(rbtree));
T->nil = malloc(sizeof(struct rbtree_node));
T->nil->rbt.color = BLACK;
T->nil->rbt.left = T->nil;
T->nil->rbt.right = T->nil;
T->root = T->nil;
return T;
}
void rbtree_left_rotate(rbtree *T,struct rbtree_node *x){
if(x == T->nil)
return;
struct rbtree_node *y = x->rbt.right;
if(y == T->nil)
return;
x->rbt.right = y->rbt.left;
if(y->rbt.left != T->nil)
y->rbt.left->rbt.parent = x;
y->rbt.parent = x->rbt.parent;
if(x->rbt.parent == T->nil){
T->root = y;
}else if(x == x->rbt.parent->rbt.left){
x->rbt.parent->rbt.left = y;
}else{//x == x->rbt.parent->rbt.right
x->rbt.parent->rbt.right = y;
}
y->rbt.left = x;
x->rbt.parent = y;
}
void rbtree_right_rotate(rbtree *T,struct rbtree_node *x){
if(x == T->nil)
return;
struct rbtree_node *y = x->rbt.left;
if(y == T->nil)
return;
x->rbt.left = y->rbt.right;
if(y->rbt.right != T->nil)
y->rbt.right->rbt.parent = x;
y->rbt.parent = x->rbt.parent;
if(x->rbt.parent == T->nil){
T->root = y;
}else if(x == x->rbt.parent->rbt.left){
x->rbt.parent->rbt.left = y;
}else{//x == x->rbt.parent->rbt.right
x->rbt.parent->rbt.right = y;
}
y->rbt.right = x;
x->rbt.parent = y;
}
void rbtree_insert_fixup(rbtree *T,struct rbtree_node *z){
//保持z一直是RED
while(z->rbt.parent->rbt.color == RED){
//父在左
if(z->rbt.parent ==