插入红黑树

时间:2013-03-22 15:58:40

标签: algorithm insert tree red-black-tree

我正在学习算法课程,在我的课程幻灯片中,有一个插入红黑树的例子:

enter image description here

我的问题是,为什么我们不让“2”成为叶子节点?看起来如果我们让它成为叶子节点,那么就不会违反红黑树的条件。我在这里缺少什么?

4 个答案:

答案 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节点的每条路径都包含相同数量的黑色节点)