红黑树
用途及特性
特性
1 主要通过 KEY VAULE 来查找。
2 中序遍历是顺序的
用途
-
cfs 进程调度系统。有序,查找高效。
-
内存管理 内存的方式有二种,首地址作为KEY , 长度作为VALUE
每malloc一次,往红黑树中添加一个节点。 另一种起始和结束地址 -
map
-
nginx
-
定时器
性质
- 每一个节点是黑或者是红
- 根节点是黑色的
- 叶子节点是黑色的
- 如果有一个节点是红色的,那么它的二个儿子节点是黑色的。 代表着相邻的节点颜色是不一样的。
- 对每一个节点,从该节点到其子孙节点的所有路径上,包含相同数目的黑节点。 意味着黑色节点是平衡的。
红黑树旋转
右旋步骤
- y的左子树b, 变成x的右子树
- y的左子树,指向x
- x的父节点,指向 y的父节点
节点插入,涉及到颜色的修正
插入的节点为 z; 插入的状态,仅为三种。
y是红色
y是黑色
void rbtree_insert_fixup(rbtree *T, rbtree_node *z) {
while (z->parent->color == RED) { //z ---> RED
if (z->parent == z->parent->parent->left) {
rbtree_node *y = z->parent->parent->right;
if (y->color == RED) {
z->parent->color = BLACK;
y->color = BLACK;
z->parent->parent->color = RED;
z = z->parent->parent; //z --> RED
} else {
if (z == z->parent->right) {
z = z->parent;
rbtree_left_rotate(T, z);
}
z->parent->color = BLACK;
z->parent->parent->color = RED;
rbtree_right_rotate(T, z->parent->parent);
}
}else {
rbtree_node *y = z->parent->parent->left;
if (y->color == RED) {
z->parent->color = BLACK;
y->color = BLACK;
z->parent->parent->color = RED;
z = z->parent->parent; //z --> RED
} else {
if (z == z->parent->left) {
z = z->parent;
rbtree_right_rotate(T, z);
}
z->parent->color = BLACK;
z->parent->parent->color = RED;
rbtree_left_rotate(T, z->parent->parent);
}
}
}
T->root->color = BLACK;
}