删除红黑树

时间:2014-05-16 17:04:43

标签: data-structures red-black-tree

我正在尝试遵循算法第3版简介中的RB-DELETE-FIXUP。他们有这个代码:

RB-DELETE-FIXUP(T, x)
 1 while x != root[T] and color[x] == BLACK
 2     do if x == left[p[x]]
 3           then w = right[p[x]]
 4                if color[w] == RED
 5                   then color[w] = BLACK                        ?  Case 1
 6                        color[p[x]] = RED                       ?  Case 1
 7                        LEFT-ROTATE(T, p[x])                    ?  Case 1
 8                        w = right[p[x]]                         ?  Case 1
 9                if color[left[w]] == BLACK and color[right[w]] == BLACK
10                   then color[w] = RED                          ?  Case 2
11                        x = p[x]                                  ?  Case 2
12                   else if color[right[w]] == BLACK
13                           then color[left[w]] = BLACK          ?  Case 3
14                                color[w] = RED                  ?  Case 3
15                                RIGHT-ROTATE(T, w)              ?  Case 3
16                                w = right[p[x]]                 ?  Case 3
17                         color[w] = color[p[x]]                 ?  Case 4
18                         color[p[x]] = BLACK                    ?  Case 4
19                         color[right[w]] = BLACK                ?  Case 4
20                         LEFT-ROTATE(T, p[x])                   ?  Case 4
21                         x = root[T]                            ?  Case 4
22        else (same as then clause with "right" and "left" exchanged)
23 color[x] = BLACK

在案例4中,我无法理解树的平衡方式。看这张图片:(来自here

案例4的结果不平衡。从D到A,黑色高度为2.而D到E,黑色高度为1.我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

您缺少的是左侧不平衡。在x的父元素已经从树中拼接出来之后调用此例程,并且仅在父元素为黑色时才调用。由于树在移除父级之前是平衡的,因此我们知道以A为根的子树必须具有黑色高度,该黑色高度比以D为根的子树小一个。因为E原来是红色而D是黑色,然后根据E的子树必须最初具有与A相同的黑色高度。在变换之后,E的颜色现在是黑色,因此它的黑色高度现在比A大一个,因此树的两侧确实是平衡的。