#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; }