【问题标题】:Is a tree with all black nodes a red black tree?所有黑色节点的树是红黑树吗?
【发布时间】:2023-08-13 08:32:02
【问题描述】:

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

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

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

更新

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

【问题讨论】:

    标签: data-structures red-black-tree


    【解决方案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