前文提到了RB-Tree 的四种不正确插入情况,这里做一个总结。
文章链接:RBTree: http://blog.tk-xiong.com/archives/799
情况1 :
S(父节点的兄弟节点)为黑色,X(新节点)为外侧插入,P(父节点)为红色,G(祖父节点)为黑色。
对于这种情况,我们先对P、G做一次单旋转,并修改P、G的颜色。
如下图:
这里需要注意的是,AB为NULL,DE不为NULL,这个是无所谓的,因为RB-Tree的平衡性本身就比AVL-Tree弱一些,但是RB-Tree的搜索效率和AVL-Tree几乎是相等的,优化到了log(n)
状况2:
相对于状况1,X为内侧插入的情况:
这里的情况和我们前面提到的LR型、RL型是很像的,不过处理方法不一样。
这里是先对左子树进行一次左旋,然后对根结点右旋。完了要记得改变节点颜色。
情况3:
X为外侧插入,这次与情况1 的区别是 S(父节点的兄弟节点)为红色
这种情况下:P、G做一次单旋转,然后改变X的颜色。
这时候如果G&G(祖父)为黑色,那么我们可以喊Ok了…但是!
如果祖父为红色…接下来继续看:
情况4:
和情况3大致一样,但是祖父节点是红色…
这样的话,还得继续往上做调整,直到父子不在有连续为红色的情况。
所以为了避免这种父子节点都是红色的情况,我们可以施行一个由上而下的程序。
假设新节点为A,那我们就沿着A的路径,只要看到某节点X的两个子节点都是红色,就把X改为红色,两个子节点改为黑色。 注意这里的X是某个节点…
如下图所示:
但是,如果X的父节点P也是红色,则做一次单旋转,改变颜色。
如下图:
额…可能不好理解吧..这个只能说。慢慢分析慢慢来…
【STL】RB-Tree 的四种调整情况