【发布时间】:2023-08-13 08:32:02
【问题描述】:
好像wiki上的定义不太准确:
http://en.wikipedia.org/wiki/Red-black_tree#Properties
所有黑色节点的树是红黑树吗?
更新
在rbtree的定义不那么严格的情况下,我们如何决定将黑色节点的子节点打印为红色还是黑色?
【问题讨论】:
标签: data-structures red-black-tree
好像wiki上的定义不太准确:
http://en.wikipedia.org/wiki/Red-black_tree#Properties
所有黑色节点的树是红黑树吗?
更新
在rbtree的定义不那么严格的情况下,我们如何决定将黑色节点的子节点打印为红色还是黑色?
【问题讨论】:
标签: data-structures red-black-tree
有可能拥有一个包含所有黑色节点的适当的红黑树。简单来说,只有一个节点的 RBTree,或者只有叶节点是根的直接子节点的 RBTree 将是所有后节点。
【讨论】:
是的,但对于具有所有红色节点的红黑树来说,情况并非如此。这样的树是无效的。哪些节点必须为黑色是有限制的。例如,叶子节点必须是黑色的,红色节点的子节点都必须是黑色的。
【讨论】:
红黑树只是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 个元素(它没有),而是因为它可以有三个子节点。跨度>
[red 3],因为它实际上是 2-3-4 版本中的[3 | 5]。
要回答问题的第二部分,关于决定将节点打印为红色还是黑色,该信息存储在每个节点中。
在典型的二叉搜索树中,每个节点都包含一个值、一个左指针和一个右指针(可能还有父指针)。在红黑树中,每个节点都包含所有这些内容加上一个额外的字段,指示该节点是红色还是黑色。然后,树上的各种操作(例如插入或删除)负责以一致的方式维护此颜色信息。
永远不会给您一棵未着色的树并告诉您为节点选择颜色(可能作为家庭作业或考试题除外)。
【讨论】:
是的,具有所有黑色节点的树可以是红黑树。 可以证明,这样的树必须是完全填充的树,才能保持等黑深度的特性。
你可以自己证明一棵全黑节点的树可以是一棵红黑树,方法是构建一棵这样的小树。 例如:
2,black
1,black 3,black
这棵树的所有节点都是黑色的,并且满足所有条件。假设根节点的父节点为 nil,两个叶节点的子节点都为 nil。希望这会有所帮助。
【讨论】:
是的,所有节点都是黑色的树可以是红黑树。这棵树必须是一棵完美的二叉树(所有叶子都在相同的深度或相同的级别,并且每个父节点都有两个子节点),因此它是唯一的黑色的树height 等于它的树高。
【讨论】:
这里有一个例子来说明红黑树的所有节点都是黑色的:
首先,将 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 按升序插入红黑树。 然后,从红黑树中按降序删除{10, 9, 8}。
最后这棵红黑树的所有节点都是黑色的。
节点全黑的红黑树与节点都只有一个键的B-树(m=4)相同。
【讨论】: