1. Inline void __rb_tree_rebalance(__rb_tree_node_base* x, __rb_tree_node_base*& root) //当前节点,根
  2.  
  3. {
  4. x->color = __rb_tree_red; //新插入的节点必然为红色,之后可以再调整颜色
  5. while(x != root && x->parent->color == _rb_tree_red) //父节点为红色,发生了冲突
  6. {
  7. //还考虑了x!=root这个边界情况
  8. If(x->parent == x->parent->parent->left)
  9. //判断父节点是不是为祖先节点的左节点
  10. {
  11. __rb_tree_node_base* y = x->parent->parent->right;
  12. /**取得伯父节点,后面根据伯父节点来操作
  13. 下面分6种情况介绍红黑树的插入操作:
  14. 1 插入点的父亲为红,父亲的兄弟节点为黑,插入点在外侧
  15. 2 插入点的父亲为红,父亲的兄弟节点为黑,插入点在内侧
  16. 3 插入点的父亲为红,父亲的兄弟节点为红,插入点在外侧
  17. 4 插入点的父亲为红,父亲的兄弟节点为红,插入点在外侧(父亲的祖父节点为红)
  18. 5 插入点的父亲为红,父亲的兄弟节点为红,插入点在内侧(两次旋转)
  19. 6 插入点的父亲为黑,直接插入
  20. *//
  21. //这里判断父节点是否为祖先节点的左节点和 取得伯父节点,判断伯父节点的颜色的目的是为了识别以上者6种情况
  22. if(y && y->color == __rb_tree_red)
  23. //不需要旋转,直接调整颜色,但是要调整到祖父的颜色,所以要再检查祖父的颜色是否达到要求,
  24. {
  25. clip_image026
  26. x->parent->color = __rb_tree_black;
  27. y->color = __rb_tree_black;
  28. x->parent->parent->color = __rb_tree_ted;
  29. x = x->parent->parent; //让祖父节点再被考察一次
  30. }
  31. Else // 没有伯父节点或者伯父节点为黑
  32. {
  33.  
  34. If(x == x->parent->right) //如果新节点为父节点的右子节点,也就是在内侧,满足第2种情况
  35.  
  36. {
  37. clip_image028
  38. X = x->parent;
  39. __rb_tree_rotate_left(x, root); //进行左旋
  40. }
  41.  
  42. clip_image030//左旋后到达这个图形,满足第1种情况,然后做下面的处理,做右旋
  43.  
  44. x->parent->color = __rb_tree_black;
  45.  
  46. x->parent->parent->color = __rb_tree_red;
  47.  
  48. __rb_tree_rotate_right(x->parent->parent, root);
  49.  
  50. clip_image032 //最后形成这样
  51.  
  52. }
  53. }
  54. Else //父节点是右子节点
  55. {
  56.  
  57. __rb_tree_node_base* y = x->parent->parent->left;
  58.  
  59. If(y&& y->color == rb_tree_red)
  60.  
  61. {
  62. clip_image034
  63. //简单修改颜色就可以
  64. x->parent->color = __rb_tree_black;
  65. y->color = __rb_tree_black;
  66. y->color = __rb_tree_black;
  67. x->parent -> parent ->color = __rb_tree_red;
  68. x = x->parent->parent;
  69. }
  70.  
  71. Else
  72.  
  73. {
  74.  
  75. If(x == x->parent->left) //先判断是否要进行叶子上的旋转
  76.  
  77. {
  78. clip_image036
  79. X = x->parent;
  80. __rb_tree_rotate_right(x, root);
  81. }
  82.  
  83. clip_image038
  84.  
  85. x->parent->color = __rb_tree_black;
  86.  
  87. x->parent->parent->color = __rb_tree_red;
  88.  
  89. __rb_tree_rotate_left(x->parent->parent, root);
  90.  
  91. }
  92.  
  93. }
  94. }
  95. Root->clolor = _rb_tree_black;
  96. }

__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. HDU 4467 Graph(图论+暴力)(2012 Asia Chengdu Regional Contest)

    Description P. T. Tigris is a student currently studying graph theory. One day, when he was studying ...

  2. linux 命令小结(随时更新)

    代码备份命令: tar cvf 备份文件名 要备份的目录名 查看Linux服务器内存使用情况: 1.free命令 free -m [root@localhost ~]# free -m        ...

  3. 第四次JAVA作业

    public class TvbDog { public static void main(String[] args) {  Dog per=new Dog("陈狗"," ...

  4. java线程(5)——线程池(上)

    引入: 在之前的例子中,我们需要使用线程时就直接去创建一个线程,这样既不浪费资源又十分方便.但如果我们需要创建多个并发的线程,而且短时间执行就结束了,如果还用之前的方式,就会大大降低效率和性能了. 因 ...

  5. 使用XML传递数据

    HTML <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...

  6. BZOJ4584 APIO2016赛艇(动态规划+组合数学)

    如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化.于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散 ...

  7. Visual Studio调试之符号文件

    原文链接地址:http://www.cnblogs.com/killmyday/archive/2009/10/14/1582882.html 前面在不能设置断点的检查步骤和Visual Studio ...

  8. 洛谷 P1268 树的重量 解题报告

    P1268 树的重量 题目描述 树可以用来表示物种之间的进化关系.一棵"进化树"是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题 ...

  9. win10 update orchestratorservere禁用

      1 Windows 10系统中有一项Update Orchestrator Service(更新协调器办事),在当地办事窗口中,我们发现 Update Orchestrator Service 办 ...

  10. WordPress后台edit-tags.php里无限栏目分类实现

    在 WordPress 里 http://localhost/wordpress3.6.1/wp-admin/edit-tags.php?taxonomy=category 这个链接可以显示 WP 里 ...