我正在学习算法课程,在我的课程幻灯片中,有一个插入红黑树的例子:
我的问题是,为什么我们不让“2”成为叶子节点?看起来如果我们让它成为叶子节点,那么就不会违反红黑树的条件。我在这里缺少什么?
答案 0 :(得分:2)
问题不在于图像的第二个树的位置,而在于不同节点的颜色。以下是解释:
红黑树中insertion的第一条规则是:新插入的节点必须始终为红色。如果第3个插入,则节点2的父节点和叔节点都是红色。所以他们需要重新变成黑色,祖父会变成红色,但祖父是根,所以它会再次变成黑色。
所以新树(插入2后)应该是这样的(r和b表示颜色,.b是Nil节点):
5b
/ \
1b 7b
/ \ / \
.b 2r .b .b
/ \
.b .b
为什么我们总是需要在RBT中插入红色节点,你可能会问?答案是,首先我们知道每个NIL节点在RBT中始终为黑色,第二个我们有规则5. Every simple path from a given node to any of its descendant leaves contains the same number of black nodes.
现在如果我们在末尾插入一个黑色节点,树将违反此规则,只需将2b放在上面的树中2r并保持1和7的颜色为红色,然后计算从根到任何Nil节点的黑色节点,你会看到一些路径有2个后节点,有些路径有3个黑节点。
答案 1 :(得分:1)
红黑树的所有叶子必须是NIL
检查属性3
答案 2 :(得分:0)
基于相同想法的wikipedia article解释如下:
在树数据结构的许多演示中,节点可能只有一个子节点,而叶节点包含数据。在这个范例中可以呈现红黑树,但它会改变几个属性并使算法复杂化。因此,本文使用“null leaves”,
所以很明显没有什么能阻止你按照自己的方式去做,但是你必须在你的算法中考虑它,这会使它们变得更加复杂。也许这个问题可以通过使用OOP来缓解,其中叶子包含元素,但表现为具有空叶子的节点。
无论如何,这是一个权衡:你将在空间中获得什么(在C中大约有两个指针设置为NULL
),你可能会失去代码复杂性,计算时间或对象运行时表示(叶子的专门方法。)
答案 3 :(得分:0)
黑色高度不均匀。
如果计算从根搜索NIL节点的黑节点数,则5-1-2-nil有3和5-7-nil或5-1-nil只有两个。
(规则:从给定节点到其任何后代NIL节点的每条路径都包含相同数量的黑色节点)