#include<bits/stdc++.h>
using namespace std;
#define BLACK 1
#define RED 0
struct node{
int value;
int color;
node * left;
node * right;
node * parent;
};
node * grandparent(node *n){
if((NULL!=n) && (n->parent!=NULL)){
return n->parent->parent;
}else
return NULL;
}
node * uncle(node *n){
node *g = grandparent(n);
if(NULL==g)
return NULL;
if(n->parent==g->left)
return g->right;
else
return g->left;
}
void insert(){
}
void rotate_left(node *n){
node *saved_p = g->left;
node *save_left_n = n->left;
g->left = n;
n->left = saved_p;
save_p->right = saved_left_n;
n->parent = g;
p->parent = n;
if(saved_left_n){
saved_left_n->parent = n;
}
}
void rotate_right(node *n){
node * saved_p = g->right;
node * saved_right_n = n->right;
g->right = n;
n->right = saved_p;
saved_p->left = saved_right_n;
n->parent = g;
p->parent = n;
if(saved_right_n){
saved_right_n->parent = n;
}
}
void insert_case5(node *n){
node * g = grandparent(n);
n->parent->color = BLACK;
g->color = RED;
if(n==n->parent->left){
rotate_right(g);
}else
rotate_left(g);
}
void insert_case4(node *n){
node *g = grandparent(n); //because parent node is red,so grandparent certainly exists
if((n==n->parent->right)&&(n->parent==g->left)){
rotate_left(n->parent);
n = n->left;
}else if((n==n->parent->left)&&(n->parent==g->right)){
rotate_right(n->parent);
n = n->right;
}
insert_case5(n);
}
void insert_case3(node *n){
node *u = uncle(n),*g;
if((NULL!=u) && (u->color==RED)){
n->parent->color = BLACK;
u->color = BLACK;
g = grandparent(n);
g->color = RED;
insert_case1(g);
}else
insert_case4(n);
}
void insert_case2(node *n){
if(n->parent->color==BLACK){
return ;
}
else
insert_case3(n);
}
void insert_case1(node *n){
if(n->parent==NULL){
n->color = BLACK;
}
else
insert_case2(n);
}
node *sibling(node *n){
if(n==NULL||n->parent==NULL){
return NULL;
}
if(n==n->parent->left)
return n->parent->right;
else
return n->parent->left;
}
void delete_case6(node *n){
node * s = sibling(n);
n->parent->color = BLACK;
if(n==n->parent->left){
s->right->color = BLACK;
rotate_left(n->parent);
}else{
s->left->color = BLACK;
rotate_right(n->parent);
}
}
void delete_case5(node *n){
node * s = sibling(n);
if(s->color==BLACK){
if((n==n->parent->left)&&(s->right->color==BLACK)&&(s->left->color==RED)){
s->color = RED;
s->left->color = BLACK;
rotate_right(s);
}
}else if((n==n->parent->right)&&(s->left->color==BLACK)&&(s->right->color==RED)){
s->color = RED;
s->right->color = BLACK;
rotate_left(s);
}
delete_case6(n);
}
void delete_case4(node * n){
node * s = sibling(n);
if((n->parent->color==RED)&&(s->color==BLACK)&&(s->right->color==BLACK)){
s->color = RED;
n->parent->color = BLACK;
}
delete_case5(n);
}
void delete_case3(node * n){
node * s = sibling(n);
if((n->parent->color == BLACK)&& (s->color==BLACK) &&(s->left->color==BLACK) && (s->right->color==BLACK)){
s->color = RED;
}else{
delete_case4(n);
}
}
void delete_case2(node * n){
node * s = sibling(n);
if(s->color == RED){
n->parent->color= BLACK;
s->color = BLACK;
if(n == n->parent->left)
rotate_left(n->parent);
else
rotate_right(n->parent);
}
delete_case3(n);
}
void delete_case1(node *n){
if(n->parent!=NULL){
delete_case2(n);
}
}
void delete_one_child(node *n){
node * child = is_leaf(n->right)?n->left:n->right;
replace_node(n,child);
if(n->color == BLACK){
if(child->color == RED)
child->color = BLACK;
else
delete_case1(child);
}
delete n;
}
int main(){
}
red-black tree
最新推荐文章于 2024-03-31 17:07:54 发布