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; }
  • 相关阅读:
    自己做的关于select工具根据属性进行选择
    ae中栅格数据转为矢量数据
    影像图配准代码实现
    ae中最短路径分析
    AE常见接口之间的关系+常见概念 .
    GIS重要概念与术语(转)
    点线面缓冲分析(转自esri中国社区)
    ae中矢量数据转换成栅格数据
    单例模式
    利用gp自己做的生成缓冲区的代码
  • 原文地址:https://www.cnblogs.com/dzy521/p/9538846.html
Copyright © 2011-2022 走看看