【问题标题】:Deletion in red black tree红黑树中的删除
【发布时间】: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


【解决方案1】:

您缺少的是左侧不平衡。此例程在 x 的父节点从树中拼接出来后调用,并且仅当父节点为黑色时才调用。由于树在移除父树之前是平衡的,所以我们知道以 A 为根的子树的黑色高度必须比以 D 为根的子树的黑色高度小一。由于 E 本来是红色的,而 D 是黑色的,那么以 E 为根的子树原来的黑色高度一定和 A 一样。经过变换后,E 的颜色现在是黑色,所以它的黑色高度现在比 A 大一,所以树的两侧确实是平衡的。

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 2016-08-03
    • 2021-01-03
    • 2021-10-17
    • 1970-01-01
    • 2013-09-01
    • 2011-03-27
    • 2012-11-01
    相关资源
    最近更新 更多