#define RED 0
#define BLACK 1
typedef struct RedBlackNode{
ElementType Data;
RedBlackNode *Left;
RedBlackNode *Right;
int colour;
};
typedef struct RedBlackNode* Root;
typedef Root RedBlackTree;
void Insert(RedBlackTree T, ElementType X)
{
RedBlackNode *t, *parent, *grandP;
if(T == NULL) //若树为空
{
T = (RedBlackTree)malloc(sizeof(struct RedBlackNode));
T->Data = X;
T->Left = T->Right = NULL;
T->colour = BLACK;
return T;
}
parent = grandP = t = T;
while(1)
{
if(t)
{
if(t->Left && t->Left->colour == RED && //如果t的两个节点都是红色 则需要进行颜色变换
t->Right && t->Right->colour == RED)
{
t->Left->colour = t->Right->colour = BLACK; //颜色变换
t->colour = RED;
insertAdjust(grandP,parent,t); //调整
}
grandP = parent;
parent = t;
t = (t->Data > X ? t->Left:t->Right);
}
else
{
//遇到需要插入的位置
t = (struct RedBlackNode*)malloc(sizeof(struct RedBlackNode));
t->Data = X;
t->Left = t->Right = NULL;
t->colour = RED;
if(X < parent->Data) t = parent->Left;
else t = parent->Right;
insertAdjust(grandP,parent,t);
T->colour = BLACK;
return;
}
}
}
void insertAdjust(RedBlackNode* gp, RedBlackNode* p, RedBlackNode* t)
{
if(p->colour == BLACK) return; //代表中间父亲结点为黑色,没有连续的红色结点,无需调整
if(p == Root)
{
P->colour = BLACK;
return;
}
if(gp->Left == p)
{
if(p->Left == t) gp = LL(gp);
else gp = LR(gp);
}
else
{
if(p->Right == t) gp = RR(gp);
else gp = RL(gp);
}
}
RedBlackNode* LL(RedBlackNode* gp)
{
RedBlackNode *p = gp->Left, *t = p->Left;
gp->Left = p->Right;
p->Right = gp;
p->colour = BLACK;
gp->colour = RED;
return p;
}
RedBlackNode* RR(RedBlackNode* gp)
{
RedBlackNode *p = gp->Right, *t = p->Right;
gp->Right = p->Left;
p->Left = gp;
p->colour = BLACK;
gp->colour = RED;
return p;
}
RedBlackNode *LR(RedBlackNode* gp)
{
RedBlackNode *p = gp->Left, *t = gp->Right;
/*进行R操作*/
p->Right = t->Left;
t->Left = p;
gp->Left = t;
/*进行L操作*/
gp->Left = t->Right;
t->Right = gp;
/*更改颜色*/
t->colour = BLACK;
gp->colour = RED;
return t;
}
RedBlackNode *RL(RedBlackNode* gp)
{
RedBlackNode *p = gp->Right, *t = gp->Left;
/*进行L操作*/
p->Left = t->Right;
t->Right = p;
gp->Right = t;
/*进行R操作*/
gp->Right = t->Left;
t->Left = gp;
/*更改颜色*/
t->colour = BLACK;
gp->colour = RED;
return t;
}