所有黑色节点的树是红黑树吗?

Posted

技术标签:

【中文标题】所有黑色节点的树是红黑树吗?【英文标题】:Is a tree with all black nodes a red black tree? 【发布时间】:2011-09-18 09:32:44 【问题描述】:

好像wiki上的定义不太准确:

http://en.wikipedia.org/wiki/Red-black_tree#Properties

更新

在rbtree的定义不那么严格的情况下,我们如何决定将黑色节点的子节点打印为红色还是黑色?

【问题讨论】:

【参考方案1】:

有可能拥有一个包含所有黑色节点的适当的红黑树。简单来说,只有一个节点的 RBTree,或者只有叶节点是根的直接子节点的 RBTree 将是所有后节点。

【讨论】:

所以rbtree的定义并不严格,你如何定义你的确切rbtree? @cpuer - 我不明白你的问题。单节点树(只有一个根)必须是黑色的。如果根的孩子是叶子,那么这些叶子必须是黑色的。只有内部节点最终会变成红色 - 具体而言,您添加的每个节点都被涂成红色,直到您确定是否需要重新绘制。 你添加的每个节点都是红色的,直到你确定它是否需要重新绘制,为什么wiki页面中没有提到这个? @cpuer:在“操作:插入”下。【参考方案2】:

是的,但对于具有所有红色节点的红黑树来说,情况并非如此。这样的树是无效的。哪些节点必须为黑色是有限制的。例如,叶子节点必须是黑色的,红色节点的子节点都必须是黑色的。

【讨论】:

我们如何决定将黑色节点的子节点打印为红色还是黑色?【参考方案3】:

红黑树只是2-3-4 tree 的二叉树表示。红黑树中的任何红色节点都对应于类比 2-3-4 树中其父节点的一部分。例如:

           [black 5]
          /         \
      [red 3]     [black 6]
     /       \
[black 2] [black 4]

是 2-3-4 树的表示

    [3 | 5]
   /   |   \
 [2]  [4]  [6]

如果一棵红黑树只有黑色节点,这意味着它表示一个只有 2 个节点(单个条目)的 2-3-4 树,而不是 3 个节点(例如 @示例中为 987654324@)或 4 节点。请注意,这基本上只是一个普通的二叉搜索树。

【讨论】:

小知识:像[3 | 5] 这样的节点不被称为 3 节点,因为它有 3 个元素(它没有),而是因为它可以有三个子节点。跨度> @jtbandes,我们如何决定将黑色节点的子节点打印为红色还是黑色? @cpuer:如果黑色节点的子节点是红色的,这意味着它们实际上是同一个 2-3-4 节点的一部分。我有[red 3],因为它实际上是 2-3-4 版本中的[3 | 5] @jtbandes,你的版本和wiki页面完全不同,为什么完全没有提到? 简单提一下:“对于每一棵2-4树,都有对应的数据元素顺序相同的红黑树。对2-4树的插入和删除操作也等价于红黑树中的颜色翻转和旋转。这使得 2-4 树成为理解红黑树背后逻辑的重要工具,这就是为什么许多介绍性算法文本在红黑树之前介绍 2-4 树的原因,即使在实践中不经常使用 2-4 棵树。” (注意 2-4 树与 2-3-4 树相同)【参考方案4】:

要回答问题的第二部分,关于决定将节点打印为红色还是黑色,该信息存储在每个节点中。

在典型的二叉搜索树中,每个节点都包含一个值、一个左指针和一个右指针(可能还有父指针)。在红黑树中,每个节点都包含所有这些内容加上一个额外的字段,指示该节点是红色还是黑色。然后,树上的各种操作(例如插入或删除)负责以一致的方式维护此颜色信息。

永远不会给您一棵未着色的树并告诉您为节点选择颜色(可能作为家庭作业或考试题除外)。

【讨论】:

放大,因为我认为这是原始发帖人的误解所在,节点总是有颜色,而不仅仅是在打印时。这些颜色可以作为插入/删除操作的一部分更改,但节点颜色始终为红色或黑色。红色和黑色不仅仅是装饰性的,它们是数据结构如何保持其平衡属性的一个组成部分。【参考方案5】:

是的,具有所有黑色节点的树可以是红黑树。 可以证明,这样的树必须是完全填充的树,才能保持等黑深度的特性。

你可以自己证明一棵全黑节点的树可以是一棵红黑树,方法是构建一棵这样的小树。 例如:

                            2,black
                      1,black      3,black 

这棵树的所有节点都是黑色的,并且满足所有条件。假设根节点的父节点为 nil,两个叶节点的子节点都为 nil。希望这会有所帮助。

【讨论】:

【参考方案6】:

是的,所有节点都是黑色的树可以是红黑树。这棵树必须是一棵完美的二叉树(所有叶子都在相同的深度或相同的级别,并且每个父节点都有两个子节点),因此它是唯一的黑色的树height 等于它的树高

【讨论】:

【参考方案7】:

这里有一个例子来说明红黑树的所有节点都是黑色的:

首先,将 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 按升序插入红黑树。 然后,从红黑树中按降序删除10, 9, 8。

最后这棵红黑树的所有节点都是黑色的。

节点全黑的红黑树与节点都只有一个键的B-树(m=4)相同。

【讨论】:

这给出了构建所有黑色节点的红黑树的具体过程。 +1

以上是关于所有黑色节点的树是红黑树吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java数据结构——红黑树

动画 | 什么是红黑树?(与2-3树等价)

数据结构Java版之红黑树

数据结构与算法-红黑树

漫画算法:什么是红黑树?

Nginx数据结构之红黑树ngx_rbtree_t