红黑树

Posted 黑.白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红黑树相关的知识,希望对你有一定的参考价值。

照着算导抄了一下!(删除未验证)

#include<iostream>
//#define BLACK 0
//#define RED 1
enum Color{
    BLACK, RED
}; 
struct Node{
    Color color;// 1 == Red ,0 == Black
    int key;
  //int num;   保存key的个数 
    Node *left, *right, *p;
};
struct RBTree{
    Node *nil, *root;
}T;
void Init(RBTree &T)
{
    T.nil = new Node;
    T.nil->color = BLACK;
    T.nil->left = T.nil->right = NULL;
    T.root = T.nil;
}
void Left_Rotate(RBTree &T, Node *x)
{
    Node *y = x->right;
    x->right = y->left;
    if(y->left != T.nil) y->left->p = x;
    y->p = x->p;
    if(x->p == T.nil) T.root = y;
    else if(x == x->p->left) x->p->left = y;
    else x->p->right = y;
    y->left = x;
    x->p = y;
}
void Right_Rotate(RBTree &T, Node *x)
{
    Node *y = x->left;
    x->left = y->right;
    if(y->right != T.nil) y->right->p = x;
    y->p = x->p;
    if(y->p==T.nil) T.root = y;
    else if(x == x->p->right) x->p->right = y;
    else x->p->left = y;
    y->right = x;
    x->p = y;
}
void RB_Insert_Fixup(RBTree &T, Node *z)
{
    while( z->p->color == RED ) // z->p->color==1
    {
        Node *y;
        if( z->p == z->p->p->left)
        {
            y = z->p->p->right;
            if( y->color== RED )//y->color == 1
            {
                z->p->color = BLACK;
                y->color = BLACK;
                z->p->p->color = RED;
                z = z->p->p;
            }
            else 
            {
                if(z == z->p->right)
                {
                    z = z->p;
                    Left_Rotate(T, z);
                }
                z->p->color = BLACK;
                z->p->p->color = RED;
                Right_Rotate(T, z->p->p);
            }
        }
        else
        {
            y = z->p->p->left;
            if( y->color == RED )//y->color == 1
            {
                z->p->color = BLACK;
                y->color = BLACK;
                z->p->p->color = RED;
                z = z->p->p;
            }
            else 
            {
                if(z == z->p->left)
                {
                    z = z->p;
                    Right_Rotate(T, z);
                }
                z->p->color = BLACK;
                z->p->p->color = RED;
                Left_Rotate(T, z->p->p);
            }
        }
    }
    T.root->color = BLACK;
}
void RB_Insert(RBTree &T, Node *z)
{
    Node *y = T.nil;
    Node *x = T.root;
    while( x != T.nil )
    {
        y = x;
        if( z->key < x->key) x = x->left;
        else x = x->right;
    }
    z->p = y;
    if( y == T.nil) T.root = z;
    else if( z->key < y->key) y->left = z;
    else y->right = z;
    z->left = z->right = T.nil;
    z->color = RED;
    RB_Insert_Fixup(T,z);
}
void RB_Print(RBTree T, Node *node)
{
    if(node != T.nil)
    {
        RB_Print(T, node->left );
        std::cout << node->key <<  ;
        if( node->color == BLACK ) std::cout << "黑\n";
        else std::cout << "红\n";
        RB_Print(T, node->right );
    }
}

void RB_Transplant(RBTree &T, Node *u, Node *v)
{
    if(u->p == T.nil)  T.root = v;
    else if( u == u->p->left) u->p->left = v;
    else u->p->right = v;
    v->p = u->p;
}

Node* RB_Tree_Minimum(RBTree &T, Node *x)
{
    while(x->left != T.nil) x = x->left;
    return x;
}

void RB_Delete_Fixup(RBTree &T, Node *x)
{
    while( x != T.root && x->color == BLACK )
    {
        if( x == x->p->left )
        {
            Node *w = x->p->right;
            if( w->color == RED )
            {
                w->color = BLACK;
                x->p->color = RED;
                Left_Rotate(T, x->p);
                w = x->p->right;
            }
            if( w->left->color == BLACK && w->right.color == BLACK )
            {
                w->color = RED;
                x = x->p;
            }
            else if( w->right->color == BLACK )
            {
                W->left->color = BLACK;
                w->color = RED;
                Right_Rotate(T, w);
                w = x->p->right;
            }
            w->color = x->p->right;
            x->p->color = BLACK;
            w->right->color = BLACK;
            Left_Rotate(T, x->p);
            x = T.root;
        }
        else
        {
            Node *w = x->p->left;
            if( w->color == RED )
            {
                w->color = BLACK;
                x->p->color = RED;
                Right_Rotate(T, x->p);
                w = x->p->left;
            }
            if( w->right->color == BLACK && w->left.color == BLACK )
            {
                w->color = RED;
                x = x->p;
            }
            else if( w->left->color == BLACK )
            {
                W->right->color = BLACK;
                w->color = RED;
                Left_Rotate(T, w);
                w = x->p->left;
            }
            w->color = x->p->left;
            x->p->color = BLACK;
            w->left->color = BLACK;
            Right_Rotate(T, x->p);
            x = T.root;
        }
    }
}

void RB_Delete(RBTree &T, Node *z)
{
    Node *y = z;
    Node *x;
    Color y_original_color = y->color;
    if( z->left == T.nil)
    {
        x = z->right;
        RB_Transplant(T, z, z->right);
    }
    else if( z->right == T.nil)
    {
        x = z->left;
        RB_Transplant(T, z, z->left);
    }
    else
    {
        y = RB_Tree_Minimum(T, z->right);
        y_original_color = y->color;
        x = y->right;
        if(y->p == z)
        {
            x->p == y;
        }
        else 
        {
            RB_Transplant(T, y, y->right);
            y->right = z->right;
            y->right->p = y;
        }
        
//        if(y->p != z)
//        {    
//            RB_Transplant(T, y, y->right);
//            y->right = z->right;
//            y->right->p = y;
//        }

        RB_Transplant(T, z, y);
        y->left = z->left;
        y->left->p = y;
        y->color = z->color;
    }
    if( y_original_color == BLACK )
    {
        RB_Delete_Fixup(T, x);
    }
}
int main (void)
{
    Init(T);
    int a;
    while(std::cin>>a, a)
    {
        Node *z = new Node;
        z->key = a;
        RB_Insert(T, z);
    }
    RB_Print(T, T.root);
    return 0;
}
/*
1
2
3
4
5
6
7
8
9
10
*/ 

 

以上是关于红黑树的主要内容,如果未能解决你的问题,请参考以下文章

[转]红黑树讲解

STL详解—— 用一棵红黑树同时封装出map和set

红黑树 实现

红黑树探索笔记

码图并茂红黑树

C++ 红黑树