red-black tree

#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(){

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值