前文提到了RB-Tree 的四种不正确插入情况,这里做一个总结。

文章链接:RBTree: http://blog.tk-xiong.com/archives/799

 

情况1 :

S(父节点的兄弟节点)为黑色,X(新节点)为外侧插入,P(父节点)为红色,G(祖父节点)为黑色。

对于这种情况,我们先对P、G做一次单旋转,并修改P、G的颜色。

如下图:

RB-Tree状况1

这里需要注意的是,AB为NULL,DE不为NULL,这个是无所谓的,因为RB-Tree的平衡性本身就比AVL-Tree弱一些,但是RB-Tree的搜索效率和AVL-Tree几乎是相等的,优化到了log(n)

 

状况2:

相对于状况1,X为内侧插入的情况:

RB-Tree状况2

这里的情况和我们前面提到的LR型、RL型是很像的,不过处理方法不一样。

这里是先对左子树进行一次左旋,然后对根结点右旋。完了要记得改变节点颜色。

 

情况3:

X为外侧插入,这次与情况1 的区别是 S(父节点的兄弟节点)为红色

这种情况下:P、G做一次单旋转,然后改变X的颜色。

RB-Tree状况3

这时候如果G&G(祖父)为黑色,那么我们可以喊Ok了…但是!

如果祖父为红色…接下来继续看:

情况4:

和情况3大致一样,但是祖父节点是红色…

这样的话,还得继续往上做调整,直到父子不在有连续为红色的情况。

RB-Tree状况4

 

所以为了避免这种父子节点都是红色的情况,我们可以施行一个由上而下的程序。

假设新节点为A,那我们就沿着A的路径,只要看到某节点X的两个子节点都是红色,就把X改为红色,两个子节点改为黑色。  注意这里的X是某个节点…

如下图所示:

RB-Tree状况4-1

但是,如果X的父节点P也是红色,则做一次单旋转,改变颜色。

如下图:

RB-Tree状况4-2

额…可能不好理解吧..这个只能说。慢慢分析慢慢来…

【STL】RB-Tree 的四种调整情况
Tagged on:
0 0 投票数
Article Rating
订阅评论
提醒

0 评论
内联反馈
查看所有评论