- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在阅读 Wikipedia explanation of red black tree removal process .
有一件简单的事情我无法理解。
例子:我有一个全黑的 RBTree
3(B)
/ \
/ \
1(B) 5(B)
/ \ / \
/ \ / \
0(B) 2(B) 4(B) 6(B)
维基百科指出,如果您要删除一个有 2 个叶子节点的节点,并且兄弟节点也是一个有 2 个叶节点的节点,那么我们可以简单地删除该节点并重新着色父节点和兄弟节点。
假设在上面的树中我想删除 0。那么重新着色 1 或 2 没有任何帮助,因为无论你做什么,两个子树(1 边)和 5 边最终具有不同的黑色高度。
我错过了什么?
我发现维基百科对insert的解释很好,但是delete的解释很困惑。
最佳答案
删除树中的节点“0”实际上是最复杂的情况。让我们关注description from wikipedia一步一步:
We use the label M to denote the node to be deleted; C will denote a selected child of M, which we will also call "its child". If M does have a non-leaf child, call that its child, C; otherwise, choose either leaf as its child, C.
因此,在这种情况下,M 是您的节点“0”,它将被删除,C 是它的任何 NIL 子节点(叶子,它们始终为 NIL)。提醒一下,您的原始树 - 遵循您美丽的 ascii 艺术是:
3(B)
/ \
/ \
1(B) 5(B)
/ \ / \
/ \ / \
0(B) 2(B) 4(B) 6(B)
所以 M 是“0”,注意这里没有画 C(NIL 叶子)。维基百科如下:
The complex case is when both M and C are black (this is our case).... In the diagrams below, we will also use P for N's new parent (M's old parent), SL for S's left child, and SR for S's right child.
因此,P为“1”,S为“2”,所有节点均为黑色。然后你按照案例描述。您跳过案例 1,因为“0”不是根。您跳过案例 2,因为“2”不是红色。情况 3 匹配:
Case 3: P, S, and S's children are black. In this case, we simply repaint S red. The result is that all paths passing through S, which are precisely those paths not passing through N, have one less black node. Because deleting N's original parent made all paths passing through N have one less black node, this evens things up. However, all paths through P now have one fewer black node than paths that do not pass through P, so property 5 (all paths from any given node to its leaf nodes contain the same number of black nodes) is still violated. To correct this, we perform the rebalancing procedure on P, starting at case 1.
所以此时,您删除“0”,并重新将 S = “2”涂成红色:
3(B)
/ \
/ \
1(B) 5(B)
\ / \
\ / \
2(R) 4(B) 6(B)
然后,根据描述,您转到案例 1,但这次将其父节点 P(=“1”)替换为 N。但是 N =“1”不是根节点,因此您跳转到案例 2。 S = "5"不是红色,所以我们再次跳转到案例 3。在这里,我们将 S = "5"重新涂成红色:
3(B)
/ \
/ \
1(B) 5(R)
\ / \
\ / \
2(R) 4(B) 6(B)
然后我们必须再次跳到案例 1,这次将 P = "3"替换为 N。 N = "3"我们看到这是一个根,所以我们完成了!树是平衡的!
关于algorithm - 从全黑红黑树中删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20810132/
过去两天我遇到了一个奇怪的问题,但我还无法解决它。我正在尝试从 2 个文本文件中获取单词并将这些单词添加到树中。我选择的获取单词的方法引用这里: Splitting a text file into
例如,像这样的树: 5 / \ 3 6 / \ 7 2 print(tree.branchLenSum()) 将是1+1+2+2=6 树类: class BinaryTre
我正在学习 JavaScript。我是文档对象模型 (DOM) 主题的新手。 我对节点在 DOM 树中的布局方式感到困惑? 我使用了这个 HTML 文件。 List Buy groceries
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
var nodeEnter = node.enter().append("g") .attr("class", "node") .attr("transform", function (d) {
我正在使用数据表来表示我的应用程序中的数据。我有一个功能,可以在单击克隆图标时克隆任何行并动态添加它下面的行。 数据表具有搜索功能,可以搜索表中存在的所有行,但是它只考虑初始页面加载时加载到表中的行。
我已经用 Python 编写了一个 Tree 类,但是我在为它创建迭代器时遇到了问题我希望能够做到 phonebook = MyTree() # Build up tree for node in p
我需要为 FreeBSD 检查这个 libunwind 端口, http://people.freebsd.org/~kib/git/libunwind.git/ 我以前和当我尝试使用命令 check
我已经实现了自己的 AVL 树,并将其用作字典。我想知道,计算以某个字符串开头的所有单词的最快方法是什么。 例如: string prefix = "fa"; output: 4 我已经在 O(n)
我目前正在尝试编写一个使用 2-3-4 树的程序,但我遇到了插入函数的问题。这是相关代码.. int main () { tree234 myTree; myTree.insert("
我的同事问了我这个问题,但我无法想出任何最佳解决方案。 给定一棵具有n 个节点、n-1 条边和 q 个查询的无向加权树。 每个查询都有输入 u v k ,输出位于路径 u to v 的奇数且小于 k
如果我有一个 app.html 模板如下: ${message} test 使用 MyComponent.ts : export class MyComponent { my
我继承了一个 git 存储库,其中树中的提交条目为空 sha1,阻止 FishEye 为存储库编制索引。 $ git fsck Checking object directoriies: 100%(2
这是一个例子。我也许可以在点击函数中弄清楚它,但我不确定从点击函数外部从根开始检查所有子项的最佳方法。谢谢 .node circle { fill: #fff; stroke: stee
我正在使用 Python 批量编辑许多当前看起来像这样的 musicXML 文件: ... -5 -9
假设有一个 8 阶 B 树。这意味着它可以有 8 个指针和 7 个元素。假设字母 A 到 G 存储在这棵 B 树中。所以这棵 B 树只是一个包含 7 个元素的节点。 然后你尝试将 J 插入到树中。没有
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试做一个简单的二维“物理”模拟,主要涉及圆形物体的碰撞,为了避免编程我自己的空间索引(四叉树/r-tree/等),我希望使用 Boost 的 R -树。 问题是我在 Boost 文档中找不到任
我正在从 python 字典中读取数据并尝试在下面的树中添加更多书籍元素。下面只是一个示例,我需要复制一个元素及其子元素但替换内容,在这种情况下我需要复制 book 元素但替换标题和作者。
假设我有一个变量,它包含一个 nltk 树类的树。是否有类似 parent() 或返回节点父节点的函数? 最佳答案 您需要一种不同的数据结构:一棵树,其节点包含指向其父节点的指针。 NLTK 现在提供
我是一名优秀的程序员,十分优秀!