红黑树-C

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

 

posted @ 2018-08-26 20:42  花花与小叮当  阅读(156)  评论(0编辑  收藏  举报