__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;
}
__rb_tree_rebalance的更多相关文章
- 带你深入理解STL之RBTree
最近一直忙于校招的笔试,STL的深入理解系列也耽搁了好几天,再加上!红黑树真的是超级超级难理解,超级超级复杂,参考了好多博客上的大神的理解才稍微明白一点,勉强入个门,下面请以一个菜鸟的角度跟着我一起学 ...
- stl源码剖析 详细学习笔记 RB_tree (2)
//---------------------------15/03/22---------------------------- //一直好奇KeyOfValue是什么,查了下就是一个和仿函数差不多 ...
- STL标准库-容器-rb_tree
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 红黑树,关联式容器底层实现(map set),在使用中基本运用不到,但是还是想了解一下他的运作方式 Red_Black tree ...
- stl_tree.h
stl_tree.h G++ ,cygnus\cygwin-b20\include\g++\stl_tree.h 完整列表 /* * * Copyright (c) 1996,1997 * Silic ...
- SGI RB-tree深入理解
前言 在学习STL源码之前我也曾无数次想要弄懂红黑数的原理,奈何每次都被困难打退.说实话,红黑树是真的很难理解,需要不断沉淀才能慢慢体会其妙处.这两天看SGI的RB-tree实现,结合侯捷老师的< ...
随机推荐
- POJ 2186 Popular Cows(强联通+缩点)
Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= ...
- C++STL——list
一.相关定义 list 链表,分配的内存不连续 可以高效地进行插入/删除元素 不可随机访问,访问速度慢 特征 只能通过迭代器来访问list中的元素 在头和尾都可以插入元素 二.list [前提条件] ...
- 使用IMAGEMAGICK的CONVERT工具批量转换图片格式
使用IMAGEMAGICK的CONVERT工具批量转换图片格式 http://www.qiansw.com/linux-imagemagick-convert-img.html Home > 文 ...
- IE图片下载
之前要用到图面下载功能,玩上找了好多,方法基本都是直接window.open(src),这样是直接在新打开的窗口中打开图片,并不是下载.考虑到IE的兼容性问题太难找了,好不容易找到一个能用的,所以保存 ...
- Java IO 之 File 的创建、重命名与遍历
File表示存储设备上的一个文件或目录,使用方式查看API即可,比较简单 package org.zln.io.file; import java.io.File; /** * Created by ...
- 【bzoj2783】[JLOI2012]树 树上倍增
题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不必一 ...
- 纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat)
纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat) 转载自:http://blog.cafeboy.org/2011/02/25/qqwry-to-ipwry/ ht ...
- oracle 导入导出语句
imp USERID/PSD@SID file='D:\1.dmp' full=y statistics=none exp USERID/PSD@SID file='D:\1.dmp' tables= ...
- TextView AutoLink, ClikSpan 与长按事件冲突的解决
前言 首先,我们先来复习一下 autoLink 和 ClickableSpan 是干什么用的. autoLink 当中有五个属性值:分别是 phone.email.map.web.all 和 none ...
- linux内存条排查
已发现2个内存错误,应用名称(kernel:),日志内容(hangzhou-jishuan-DDS0248 kernel: sbridge: HANDLING MCE MEMORY ERROR han ...