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

Data structures 具有所有黑色节点的树是红黑树吗?,data-structures,red-black-tree,Data Structures,Red Black Tree,wiki上的定义似乎不准确: 具有所有黑色节点的树是红黑树吗 更新 由于rbtree的定义不太严格,我们如何决定是否将黑色节点的子节点打印为红色还是黑色?可以有一个包含所有黑色节点的正确红黑树。很简单,只有一个节点的RBTree,或者只有叶节点是根的直接子节点的RBTree,都是后向节点。是的,但对于所有红色节点的红黑树,情况并非如此。这样的树是无效的。对于哪些节点必须为黑色有一些限制。例如,叶节点必须是黑色的,而红色节点的子节点都必须是黑色的。红黑树只是一个二叉树的表示形式。红黑树中的任何红

wiki上的定义似乎不准确:

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

更新


由于rbtree的定义不太严格,我们如何决定是否将黑色节点的子节点打印为红色还是黑色?

可以有一个包含所有黑色节点的正确红黑树。很简单,只有一个节点的RBTree,或者只有叶节点是根的直接子节点的RBTree,都是后向节点。

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

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

           [black 5]
          /         \
      [red 3]     [black 6]
     /       \
[black 2] [black 4]
                            2,black
                      1,black      3,black 
是2-3-4树的表示形式

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

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

要回答问题的第二部分,即决定是否将节点打印为红色或黑色,信息存储在每个节点中

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


你永远不会得到一棵未着色的树,并被告知为节点选择颜色(可能作为家庭作业或考试问题除外)。

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

你可以通过构建一棵这样的小树来证明一棵拥有所有黑色节点的树可以是一棵红黑树。 例如:

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

该树具有所有黑色节点,并且满足所有条件。假设根节点的父节点为nil,而两个叶节点的子节点均为nil。希望这能有所帮助。

,所有节点均为黑色的树可以是红黑树。这棵树必须是一棵完美的二叉树(所有的叶子都在同一深度或同一层次,其中每个父树都有两个子树),因此,它是唯一一棵黑高等于树高的树。

下面是一个例子,说明红黑树的所有节点都是黑的:

首先,在红黑树中按递增顺序插入{1,2,3,4,5,6,7,8,9,10}。 然后,从红黑树中按降序删除{10,9,8}

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


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

所以rbtree的定义并不严格,你如何定义你的确切rbtree?@cpuer-我不理解你的问题。单节点树(仅根)必须为黑色。如果根的子元素是叶子,那么这些叶子必须是黑色的。只有内部节点最终会变成红色——特别是,您添加的每个节点都是红色的,直到您确定是否需要重新绘制。您添加的每个节点都是红色的,直到您确定是否需要重新绘制,为什么在wiki页面中没有提到这一点?@cpuer:在“操作:插入”下.Side trivia:像
[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树相同)我们如何决定是否将黑色节点的子节点打印为红色或黑色?为了放大,因为我认为这是原始海报的误解所在,节点总是有一种颜色,而不仅仅是在打印时。这些颜色可以在插入/删除操作中更改,但节点颜色总是红色或黑色。红色和黑色-ness不仅仅是表面的,它是数据结构如何保持其平衡属性的一个组成部分。这给出了构建所有黑色节点的红黑树的具体过程。+1