红黑树为一颗“近似”平衡的二叉树。
1.红黑树性质
性质主要由5点。
1.根节点root必须为黑色的。
2.叶子节点leaf必须为黑色的,叶子节点为虚拟的节点,以NIL节点表示。
3.所有节点必须为黑色或红色。
4.红色节点的子节点必须为黑节点。(这点性质提出来很牛逼)
5.以“任意”节点开始,左子树于右子树的黑节点数量必须相同.(此性质保证了红黑树的最低高度和最高高度不超过2倍)。
以上5个节点需要自行的理清楚了再看插入及删除。主要记住性质4和性质5。
2.插入
新插入的节点必须为红色:
插入时,插入的新节点为红色的,为什么为红色的,如果新插入的节点为黑色,违反性质5, 所以新增的节点所在的子树还需再减少一个黑色性质的节点,再往后思考最总还是回归到新增节点必须为红色。
下面介绍新插入红色节点时如何保证红黑树个点性质(既保障了平衡)的几种情况:
讲解之前先定义几种变量和结构体。
typedef struct rb_node{
void* key;
rb_node* p; //父节点
rb_node* l; //左节点
rb_node* r; //右节点
char color; //颜色。
}rb_node;
n为新插入的节点。
n->p (p)为n的父节点。
n->p->p(pp)我n的祖父节点。
if (n->p == n->p->p->l) {
u = n->p->p->r //u为n的叔叔节点。
} else {
u = n->p->p->l
}
n 标识插入的新节点。
情况1: n->p (n的父节点) == black的时候。 此时不违法任何红黑树的性质。
情况2: n->p == red(n->p->p n的祖父节点必为黑色的,因为插入之前的红黑树必符合红黑树的5点性质)。此时违反了性质4.
当情况2发生时,又分为以下几种小情况:
a.n的叔叔节点u == black时,此时只需要把n->p节点(red色)旋转(树的旋转次数不再赘述)至u的父节点上。如图:
调整前:
pp( black)
| |
p( red) u( black)
|
n( red)
调整后:
p( black)
| |
n( red) pp( red)
|
u( black)
此方法以p为pp的左子树,n为p的左子节点为例子。
如果n为p的右节点,则需要先把n旋转至p的左节点后再做上述操作。
b.n的叔叔节点u == red时,此时无法旋转父节点p的颜色至u的父节点,因为u也为red,旋转后u(red),u->p(red)仍然违反性质4.
所以,此时只能把p及u的颜色设置为black。pp设置为red。并认为pp为新增的节点n,重复情况1及情况2.
至此,红黑树的插入讲解完成。
3.删除
假设:
待删除节点为d。
删除节点的父节点为p。
待删除节点的兄弟节点为b。
删除较插入稍微麻烦点。
情况1:删除的节点为红色,此时不违反红黑树性质。
情况2:删除的节点为黑色,此时又分为以下几种情况:
a.删除的节点只有一个子树。(不算nil叶子节点)
b.删除的节点有左右子树。此时需要找到被删除节点的后继(也可找前驱)。以后继的key值填充被删除节点的key,并以后继为删除节点去处理。
因为有双子节点的删除比单子树节点的删除非常麻烦。
b情况最终转换为a情况
当删除节点的子节点为红色的时候,则直接把d->child涂为黑色,完成红黑树的各个性质。
当d->child为黑色的时候,此时被删除节点之前所在的子树少一个黑节点,违反性质5,后面则想办法给删除的子树增加一个黑节点。(主体思想为从兄弟子树旋转一个红色节点过来,然后涂成黑色)
分为以下几种子情况。
1.兄弟节点b为红色的时候。
2.兄弟节点b为黑色的时候,又分为两种情况。
2.a. b的双孩子都为黑的时候,b节点颜色涂成白色。d->child指向p。
如果p为白色,则把p涂成黑色,满足红黑树性质5。
如果p为黑色,则以p->child指向p.从头判断开始删除操作。
2.b. b的双孩子一红一黑的时候。b节点的黑色性质转移到d子树。由于b节点所在子树少一个黑色性质。所以b节点的那个红色的孩子需要涂色为black。
现在以b为p的r孩子为例说明(b为p的l对称的):
1. 如果b的r孩子为红色,则把b->r涂色为black。b的颜色涂成p的颜色(注意这块一定要涂成p的颜色,才不违反红黑树性质)。然后以p为节点“左旋转”红黑树。
此时d子树就多一个p节点,然后把p节点涂成黑色,至此满足红黑树性质5。
2. 如果b的r孩子为黑,l孩子为红。则以b为节点“右旋转”。把白色节点旋转至b的孩子,再继续上述1操作。
备注:
“则以b为节点“右旋转”。把白色节点旋转至b的孩子”说明:
b( black)
| |
r( red) l( black)
旋转后:
r( black)
|
b( red)
|
l( black)
下一章节介绍b树