给定n个节点上的红黑树,任何根到叶子路径上的红色节点的最大数量是多少?

时间:2016-11-15 18:57:10

标签: algorithm binary-tree binary-search-tree red-black-tree

这是一个测验问题。我不确定我的答案是否正确。请帮帮我。

让我们说高度为h,因为没有两个连续的节点(当我们上树时)可以是红色,红色节点的最大数量不是h / 2吗? (h = log n)

不知何故,我觉得这不是正确的答案。

任何帮助/输入将不胜感激!

提前非常感谢你!

2 个答案:

答案 0 :(得分:0)

**编辑**这个答案假定高度的定义是从根到叶子的最长路径中的节点数(例如,在lecture notes here中使用),包括"虚拟&#34 ;黑叶节点。更常见的定义计算边数,并且不包括叶节点。使用此定义,答案为round(h/2),如果将叶节点包含在高度round_down(h/2)中。 **编辑结束**

如果您按照Wikipedia中的根节点为黑色的规则,则正确答案是小于h / 2的最大整数。这只是因为根和叶是黑色的,并且其间的一半节点(向上舍入)可以是红色的。即round((h-2)/2)

你也可以通过考虑一些不同高度的小红黑树来找到规则。

案例h=1根是黑色的 - > 0个红色节点

案例' h = 2'根是黑色的,叶子是黑色的 - > 0个红色节点

案例h=3根是黑色,第二级可以是红色,而树叶必须是黑色 - >最多1个红色节点

案例h=4根是黑色,第二级可以是红色,第三级必须是黑色,而叶子必须是黑色 - >最多1个红色节点

案例h=5黑色,红色,黑色,红色,黑色 - >最多2个红色节点。

作为h函数的n比较棘手,但可以显示h <= 2 log (n+1),它可以保证对数搜索时间。有关证明,请参阅Searching and Search Trees II (page 11)。证明基于以下事实:红黑树的规则保证从x开始的子树包含至少2^(bh(x)) - 1个内部节点,其中bh(x)是黑色高度 - 数量为从根到叶的路径中的黑色节点。这通过归纳证明了。然后通过注意到最多一半的节点是黑色的(我们说的是子树,因此根可以是红色的)bh(x) >= h/2。现在使用这些结果我们得到n >= 2^bh(x) - 1 >= 2^(h/2) -1。求解h,我们得到答案h <= 2 log(n+1)

由于问题是测验,因此hlog(n)log(n)成正比应该足够了。

答案 1 :(得分:0)

让我们首先看看有多少节点(最小化 n )来制作一个带有1个红色节点的路径(*为黑色):

  *
 / \
*   R
   / \
  *   *

当需要1个红色节点时, n 必须至少为5。它有3个叶子节点和2个内部节点。删除任何节点都需要删除红色节点以保持在the rules范围内。

如果我们想要扩展此树以获得具有2个红色节点的路径,我们可以应用以下两个步骤:

  1. 所有叶子都有两个黑人孩子
  2. 最右边的叶子(刚刚添加)变成了一个红色的节点,它有2个黑人孩子。
  3. 美元符号是与普遍树相比增加的黑色节点:

        *
       / \
      *   R
     /|  / \
    $ $ *   *
       /|  / \
      $ $ $   R
             / \
            $   $
    

    我们选择在右侧放置红色节点的路径;这种选择不会影响结论。请注意,在其他较短路径中添加红色节点没有帮​​助,因为这样只会增加节点数量而不会增加最多红色节点的路径。

    叶节点数(L)在步骤1中翻倍,而叶子节点成为内部节点(I)。 第二步增加了内部节点的数量和叶子数量1.更正式地说,我们可以找到这些公式,其中索引 r 表示红色节点的数量:

    L 1 = 3
    1 = 2

    L r + 1 = 2L r + 1
    I r + 1 = I r + L r + 1

    放入表格以增加 r

      r |   L |   I |  n=L+I
    ----+-----+-----+-------
      1 |   3 |   2 |   5
      2 |   7 |   6 |  13
      3 |  15 |  14 |  29
      4 |  31 |  30 |  61
    ... | ... | ... | ...
    

    我们可以看到以下情况:

    L r = 2 r + 1 - 1
    I r = 2 r + 1 - 2

    所以:

    n r = 2 r + 2 - 3

    因此,我们有一个公式,用于了解具有 r 红色节点的路径所需的最小节点数。我们需要一个不同的关系:给定 n r 的最大值。

    从上面我们可以推导出:

    r =⌊log 2 (n + 3)⌋ - 2