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

__rb_tree_rebalance的更多相关文章

  1. 带你深入理解STL之RBTree

    最近一直忙于校招的笔试,STL的深入理解系列也耽搁了好几天,再加上!红黑树真的是超级超级难理解,超级超级复杂,参考了好多博客上的大神的理解才稍微明白一点,勉强入个门,下面请以一个菜鸟的角度跟着我一起学 ...

  2. stl源码剖析 详细学习笔记 RB_tree (2)

    //---------------------------15/03/22---------------------------- //一直好奇KeyOfValue是什么,查了下就是一个和仿函数差不多 ...

  3. STL标准库-容器-rb_tree

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 红黑树,关联式容器底层实现(map set),在使用中基本运用不到,但是还是想了解一下他的运作方式 Red_Black tree ...

  4. stl_tree.h

    stl_tree.h G++ ,cygnus\cygwin-b20\include\g++\stl_tree.h 完整列表 /* * * Copyright (c) 1996,1997 * Silic ...

  5. SGI RB-tree深入理解

    前言 在学习STL源码之前我也曾无数次想要弄懂红黑数的原理,奈何每次都被困难打退.说实话,红黑树是真的很难理解,需要不断沉淀才能慢慢体会其妙处.这两天看SGI的RB-tree实现,结合侯捷老师的< ...

随机推荐

  1. Manacher算法——最长回文子串

    一.相关介绍 最长回文子串 s="abcd", 最长回文长度为 1,即a或b或c或d s="ababa", 最长回文长度为 5,即ababa s="a ...

  2. js中迭代元素特性与DOM中的DocumentFragment类型 笔记

    JS中迭代元素特性 在需要将DOM结构序列化为XML或者HTML字符串时,多数都会涉及遍历元素的特性,这个时候attributes属性就可以派上用场. 以下代码展示了如何迭代元素的每一个特性,然后将他 ...

  3. lintcode-115-不同的路径 II

    115-不同的路径 II "不同的路径" 的跟进问题: 现在考虑网格中有障碍物,那样将会有多少条不同的路径? 网格中的障碍和空位置分别用 1 和 0 来表示. 注意事项 m 和 n ...

  4. 传统IT七大职业的云计算转型之路

    毫无疑问,对于那些传统IT技术--企业架构师.系统管理者.测试验收工程师或者网络工程师等开发人员骑身到云计算行业不仅是大势所趋,也能为其带来工作的保证,薪酬也更加丰厚. 如今,企业上云已经成为不可阻挡 ...

  5. To Chromium之浏览器外框UI(2)

    之前一些文章本来是草稿状态,一次性全release出来了,排版上可能看上去不太舒服,等哪一天研究下改改排版. Here继续chromium的UI,看看,浏览器的外壳是怎么被画出来的:) 可以先关注下几 ...

  6. JSP九大内置对象及其方法

    内置对象包括 request response pageContext session application out config page exception 1.out (1)clear()清除 ...

  7. ACM 竞赛高校联盟 练习赛 第二场 B&C

    B. 题解: 枚举约数即可,判断n个数能否填约数的整数倍 #include <iostream> #include <cstring> #include <cstdio& ...

  8. mii-tool与ethtool的用法详解

    mii-tool与ethtool的用法详解 1.mii-tool 配置网络设备协商方式的工具: 感谢原文作者!原文地址:http://blog.chinaunix.net/uid-20639775-i ...

  9. 【C++ 拾遗】Function-like Macros

    Macro expansion is done by the C preprocessor at the beginning of compilation. The C preprocessor is ...

  10. BZOJ4568 [Scoi2016]幸运数字 【点分治 + 线性基】

    题目链接 BZOJ4568 题解 选任意个数异或和最大,使用线性基 线性基插入\(O(logn)\),合并\(O(log^2n)\) 我们要求树上两点间异或和最大值,由于合并是\(O(log^2n)\ ...