红黑树的基本原理

来源:互联网 发布:js array push index 编辑:程序博客网 时间:2024/05/21 07:09

图片来自:http://blog.csdn.net/hackbuteer1/article/details/7760584


红黑树的特性

红黑树是一种平衡二叉树。不过与AVL树非常严格的平衡不同,红黑树是一种局部平衡,确保没有一条路径会比其他路径长出两倍。

STL中的关联式容器默认的底层实现都是红黑树。

 

红黑树遵循以下原则:

1.        根节点是黑色

2.        NIL节点是黑色

3.        节点的颜色只能是黑色或者红色(删除节点时会用到这个原则)

4.        红色节点的两个字节点一定是黑色

5.        任一节点到NIL的任何路径,经过的黑色节点数一致

 

红黑树的插入

首先,按照搜索树的性质插入节点,并把节点标记为红色。(1)

接着,调节红黑树:

Ø  如果插入节点是根节点,将节点涂黑,插入结束。

Ø  如果插入节点不是根节点,

    Ø 如果插入节点的父节点是黑色,红黑树性质不被破坏,插入结束。

    Ø 如果插入节点的父节点是红色,则:

         Ø 当叔节点(父节点的兄弟节点)是红色时,父节点P、叔节点S、祖父节点G变换颜色;当前节点指向祖父节点G。循环调整红黑树。

         Ø  当叔节点时黑色时:

                  Ø  从内侧插入,则以插入节点I和父节点P为轴,进行单旋,变成从外侧插入。循环调整红黑树。(2)

                  Ø 从外侧插入,则以父节点P和祖父节点G为轴,进行单旋,并改变父节点和祖父节点的颜色。插入结束。(3)

注释:

(1)      将插入节点标记为红色的原因是,插入黑色节点会增加经过该节点的所有路径的黑色节点数目,导致原则5被破坏。而原则5是最难调整的,故应避免。

(2)      

             

 

 

 

红黑树的删除

Z:需要删除的节点

Y:实际删除的节点

X:Y的子节点

首先,按照搜索树的性质删除节点,不改变红黑树节点的颜色。

接着,调整红黑树:

Ø  如果删除的是根节点,直接删去。删除结束

Ø  如果删除的不是根节点,

      Ø  如果删除的节点Y是红色,红黑树不被破坏,删除结束。(1)

      Ø  如果删除的节点Y是黑色,Y的黑色被加在其子节点X上,则:(2)

            Ø 如果X为红色,即X为红+黑,则直接将X变成黑色。删除结束

            Ø 如果X为黑色,即X为黑+黑,则:

                 Ø  如果X的兄弟节点W为红色,以父节点P和兄弟节点X为轴,进行一次单旋并交换颜色。删除结束。(3)

                 Ø  如果X的兄弟节点W为黑色:

                     Ø 兄弟节点W的两个子节点都是黑色,则X和S脱掉一层黑色,加到他们的父节点上。以父节点为当前节点,循环调整红黑树。

                     Ø 兄弟节点W的右节点为黑色时,交换W和其左子节点K的颜色,并以WK为轴交换,单旋,变成兄弟节点W的右节点为红色的情况。循环调整红黑树。(4)

                     Ø 兄弟节点W的右节点为红色时,以兄弟节点W和父节点P为轴,进行单旋。变换后的W节点的颜色跟原来父节点P的颜色一致,W的两个子节点变为黑色。删除结束。(5)

注释:

(1)      删除红色节点,不会破坏红黑树的原则。

(2)      删除黑色节点,会破坏原则5,而原则5被破坏影响的是全局,这样要调整红黑树就比较困难了。所以,我们把被删除的节点的黑色加到它的子节点X上,再调整红黑树。这样,X就会具备黑-黑或者红-黑两种黑色,破坏了原则3,但相对于原则5的杀伤力,还是可以接受的。

接下来,要考虑的就是如何处理X上面多出来的一层黑色。如果是红+黑,直接涂黑既可。如果是黑+黑,则要分情况去掉X上的黑色。

(3)      

(4)      

(5)      


0 0
原创粉丝点击