【发布时间】:2014-07-05 05:39:39
【问题描述】:
我正在尝试遵循算法简介第 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。我在这里缺少什么?
【问题讨论】:
-
我不知道,我一直在研究这个问题。当我实现一个 RB 树时,我使用了 wikipedia 作为参考,它有不同的情况。我会继续努力,看看我缺少什么。
标签: data-structures red-black-tree