zoukankan      html  css  js  c++  java
  • 红黑树-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; }
  • 相关阅读:
    git学习笔记
    ubuntu常用命令
    hdfs[命令] fsck
    hdfs[命令] dfsadmin
    hdfs[命令] dfs
    Hadoop2.0新特性-持续追加【干货】
    Cloudera 建议使用 NTP 使 Hadoop 群集实现时间同步
    Cloudera CDH5 部署实战指南(离线安装)
    没有用户画像,别谈精准营销
    用户画像数据建模方法
  • 原文地址:https://www.cnblogs.com/dzy521/p/9538846.html
Copyright © 2011-2022 走看看