red-black tree

来源:互联网 发布:淘宝信誉刷到皇冠 编辑:程序博客网 时间:2024/06/05 14:12
#include<bits/stdc++.h>using namespace std;#define  BLACK 1#define  RED 0struct 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(){}
0 0