红黑树(带色的二叉查找树)
(1)根结点黑色
(2)红色结点的子结点为黑色(红色不相邻)
(3)某结点到所有的空结点路径含相等数目的黑结点
"(4)空结点为黑色"
====================================================================
红黑树插入(插入红结点)
(1)父结点黑,不变
(2)父结点红=>父父结点黑
(1)叔红:父叔变黑,父父变红,迭代
(2)叔黑:双旋(新,父,父父中间大小作为根(黑),其他为子(红)),变色
情形1:
情形2:
情形3:
情形4:
(3)插入的是根,直接改黑
==========================================================================
红黑树删除(只能是删除叶结点或 黑-红结点)--->删右子最大(后驱)
(1)红叶结点:直接删
(2)黑-红结点(叶):红替换黑
(3)黑叶结点:
情形2:兄弟节点S是红色
[对应我第二篇文章中,情况1:x的兄弟w是红色的。]
void delete_case2(struct node *n)
{
struct node *s = sibling(n);
if (s->color == RED) {
n->parent->color = RED;
s->color = BLACK;
if (n == n->parent->left)
rotate_left(n->parent); //左旋
else
rotate_right(n->parent);
}
delete_case3(n);
}
情况 3: 兄弟节点S是黑色的,且S的俩个儿子都是黑色的。但N的父节点P,是黑色。
[对应我第二篇文章中,情况2:x的兄弟w是黑色的,且兄弟w的俩个儿子都是黑色的。
(这里,父节点P为黑)]
void delete_case3(struct node *n)
{
struct node *s = sibling(n);
if ((n->parent->color == BLACK) &&
(s->color == BLACK) &&
(s->left->color == BLACK) &&
(s->right->color == BLACK)) {
s->color = RED;
delete_case1(n->parent);
} else
delete_case4(n);
}
情况4: 兄弟节点S 是黑色的、S 的儿子也都是黑色的,但是 N 的父亲P,是红色。
[还是对应我第二篇文章中,情况2:x的兄弟w是黑色的,且w的俩个孩子都是黑色的。
(这里,父节点P为红)]
void delete_case4(struct node *n)
{
struct node *s = sibling(n);
if ((n->parent->color == RED) &&
(s->color == BLACK) &&
(s->left->color == BLACK) &&
(s->right->color == BLACK)) {
s->color = RED;
n->parent->color = BLACK;
} else
delete_case5(n);
}