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