红黑树的删除(算法导论)

红黑树的删除分两个部分介绍,第一个部分介绍节点的删除;第二部分介绍在将节点删除后对红黑树的调整,使得其能符合红黑树的性质。

1、节点的删除

         假如要删除的节点为z,这时,有三种情况:

         1)节点z没有孩子节点,这时直接将z节点删除,然后判断节点z是否为黑色的,若z为黑色的,则在删除后会导致黑高不相等。于是需要对红黑树进行调整,见第二部分。

         2)节点z只有一个孩子节点,此时直接使用其孩子节点代替z节点,然后判断删除的z节点是否为黑,若为黑,则需对红黑树进行调整。

         3)节点z有左右孩子节点,这时首先找到z节点的后继节点y, 这时又有两种情况:第一种情况是y是z的右孩子节点,第二种情况是y不是z的右孩子节点。当y不是z的右孩子时,这时需要把y节点从原来的地方剥离出来,然后替换掉节点z。并用y的右孩子x填补y的位置。

         注意,y不可能有左孩子节点,因为如果有左孩子节点则它的左孩子节点更有可能成为节点z的后继。因而y节点要么没有孩子节点,要么只有右孩子。


图1.1

         在节点的删除中,第一二种情况,若删除的是红色的则无需进行调整;若删除的节点为黑色的,则需要对红黑树进行调整。

         在第三种情况中,通过使用z的后继节点y替换z节点,然后使用y的右孩子x来填补y的位置。在此过程需要将节点y进行移动,由于移动之后的y节点保持原来z节点的颜色,而x节点在代替y节点之后可能会出现问题,当然只会在y节点是黑色的情况下才会出现问题,当y节点为红色时,移动时红黑树的性质不会被破坏,y节点为黑色时,一定会出现黑高的不相等,并且也可能会出现两个连续的红色节点。这时需要对其进行下一步调整。

 

图 1.2

2、红黑树的调整

         在上部分的第一二种情况中,若删除的节点z为黑色的,这时,为了保持黑高不被破坏,我们可以将替代z的节点x再加一种再额外增加一种黑色。此时节点x可能是双黑或者红黑,若为红黑则只需删除其中的红色保留黑色即可,若为双黑色则需要做进一步的调整。

         在上部分第三种情况中,若移动的节点y是黑色的,则将代替节点y的节点x额外增加一种黑色,使得树的黑高相等。同样,此时的x节点可能为双重黑色或红黑色,若是红黑色则只需保留黑色即可,若为双黑色则需要对树进行调整。

         当节点x具有双重黑色的特性时需要对其进行调整。这时有两种情况,分别为:x是左孩子节点和x是右孩子节点。由于这两种情况是对称的,因而在此只对x是左孩子节点的情况进行讨论。

         当x为左孩子节点时,这时又有四种情况。

1)x的兄弟节点w是红色的。这种情况不好处理,因为x的兄弟节点w为红色,不能将黑色直接上移。所以对其做一些变换,首先将w变成黑色,x的父节点变成红色,然后以x.p为中心进行左旋。旋转后的x的兄弟节点为原来w的左孩子,此节点必为黑色,因为w为红色。通过这一步,我们就能确保x的兄弟节点为黑色,为下一步调整做好准备。


图 2.1

2)x的兄弟节点w是黑色的,并且w的两个子节点也是黑色的。此种情况比较好办,我们可以通过将x和w中的一个黑色上移到x的父节点,使得x的父节点变成新的x节点。在将x上的一个黑色上移后还剩下了一个黑色,将w的黑色上移后w只剩下了红色。若新的x为红黑色,则将新的x变成黑色,调整结束;若新的x为双黑色时,并且此时的x不为根节点,则继续进行调整,否则结束。


图2.2

3)x的兄弟节点w是黑色的,并且w的左孩子为红色,右孩子为黑色。这种情况不能提取x和w的黑色上移,因为w的孩子有红色节点。此种情况w的左孩子为红色,右孩子为黑色。我们首先以w为中心进行右旋,并且将w的左孩子的颜色修改为黑色,将w修改为红色。这时将此种情况转化成了第四种情况,即x的兄弟节点w的右孩子为红色节点。


图 2.3

4)x的兄弟节点w是黑色的,并且w的右孩子为红色,左孩子颜色任意。这时,首先将w的颜色改为其父节点的颜色,x的父节点和w的右孩子修改为黑色。然后以x的父节点为中心进行左旋,最后将x指向其根节点。


图 2.4

最后,有一个问题,在删除或移动黑色节点时,需要将他的黑色下推给他的孩子节点。若孩子节点为空,这时将无法将黑色下推。若黑色向上推则会导致黑高的不相等。这时如何解决?


posted @ 2014-11-05 15:10  liuwu265  阅读(6985)  评论(1编辑  收藏  举报