zoukankan      html  css  js  c++  java
  • __rb_tree_rebalance

    Inline void __rb_tree_rebalance(__rb_tree_node_base* x, __rb_tree_node_base*& root)  //当前节点,根
    
    {
        x->color = __rb_tree_red;                                          //新插入的节点必然为红色,之后可以再调整颜色
        while(x != root && x->parent->color == _rb_tree_red)   //父节点为红色,发生了冲突
        {
            //还考虑了x!=root这个边界情况
            If(x->parent == x->parent->parent->left)
            //判断父节点是不是为祖先节点的左节点
            {
                __rb_tree_node_base* y = x->parent->parent->right;
                /**取得伯父节点,后面根据伯父节点来操作
                下面分6种情况介绍红黑树的插入操作:
                1 插入点的父亲为红,父亲的兄弟节点为黑,插入点在外侧
                2 插入点的父亲为红,父亲的兄弟节点为黑,插入点在内侧
                3 插入点的父亲为红,父亲的兄弟节点为红,插入点在外侧
                4 插入点的父亲为红,父亲的兄弟节点为红,插入点在外侧(父亲的祖父节点为红)
                5 插入点的父亲为红,父亲的兄弟节点为红,插入点在内侧(两次旋转)
                6 插入点的父亲为黑,直接插入
                *//
                //这里判断父节点是否为祖先节点的左节点和 取得伯父节点,判断伯父节点的颜色的目的是为了识别以上者6种情况
                if(y && y->color == __rb_tree_red)
                    //不需要旋转,直接调整颜色,但是要调整到祖父的颜色,所以要再检查祖父的颜色是否达到要求,
                {
                    clip_image026
                    x->parent->color = __rb_tree_black;
                    y->color = __rb_tree_black;
                    x->parent->parent->color = __rb_tree_ted;
                    x = x->parent->parent;                                          //让祖父节点再被考察一次
                }
                Else // 没有伯父节点或者伯父节点为黑
                {
    
                    If(x == x->parent->right)                                     //如果新节点为父节点的右子节点,也就是在内侧,满足第2种情况
    
                    {
                        clip_image028
                        X = x->parent;
                        __rb_tree_rotate_left(x, root); //进行左旋
                    }
    
                    clip_image030//左旋后到达这个图形,满足第1种情况,然后做下面的处理,做右旋
    
                    x->parent->color = __rb_tree_black;
    
                    x->parent->parent->color = __rb_tree_red;
    
                    __rb_tree_rotate_right(x->parent->parent, root);
    
                    clip_image032  //最后形成这样
    
                }
            }
            Else      //父节点是右子节点
            {
    
                __rb_tree_node_base* y = x->parent->parent->left;
    
                If(y&& y->color == rb_tree_red)
    
                {
                    clip_image034
                    //简单修改颜色就可以
                    x->parent->color = __rb_tree_black;
                    y->color = __rb_tree_black;
                    y->color = __rb_tree_black;
                    x->parent -> parent ->color = __rb_tree_red;
                    x = x->parent->parent;
                }
    
                Else
    
                {
    
                    If(x == x->parent->left)  //先判断是否要进行叶子上的旋转
    
                    {
                        clip_image036
                        X = x->parent;
                        __rb_tree_rotate_right(x, root);
                    }
    
                    clip_image038
    
                    x->parent->color = __rb_tree_black;
    
                    x->parent->parent->color = __rb_tree_red;
    
                    __rb_tree_rotate_left(x->parent->parent, root);
    
                }
    
            }
        }
        Root->clolor = _rb_tree_black;
    }
  • 相关阅读:
    教您搭建与布署NTP网络时钟服务器
    利用北斗卫星系统设计NTP网络时间服务器
    GPS同步时钟(北斗时间服务器)守时方法研究
    京准讲述NTP时钟服务器应用及原理
    标准化考场时钟系统(电子时钟)时间同步设备
    北斗授时产品详解与应用
    IRIG-B码对时是变电站自动化系统的基本要求
    北斗同步时钟(主时钟控制器)应用于电气化铁道远动系统
    IEEE1588PTP在数字化变电站时钟同步方面的应用
    thinkphp6学习教程与源码 tp6开源CMS系统源码研究
  • 原文地址:https://www.cnblogs.com/chenyang920/p/5136875.html
Copyright © 2011-2022 走看看