Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何创建具有最大高度的红黑树?_Algorithm_Binary Tree_Red Black Tree - Fatal编程技术网

Algorithm 如何创建具有最大高度的红黑树?

Algorithm 如何创建具有最大高度的红黑树?,algorithm,binary-tree,red-black-tree,Algorithm,Binary Tree,Red Black Tree,红黑树的最大高度为2*log(n+1),因此如果节点数为15,则最大高度应为2*log(16)或8。我一直在尝试绘制一棵高度8的红黑树,同时只使用15节点,但如果不打破红黑树的规则,我无法这样做。如何使用15节点创建高度为8的红黑树?从CLR读取的伪代码。在应用任何旋转来更改颜色或平衡树之前,在树中新插入红色节点时,似乎可以达到最大高度。以下树演示了外部节点为3,最大高度为4的情况: black(h=4) / \ nul red(h=3)

红黑树的最大高度为
2*log(n+1)
,因此如果节点数为
15
,则最大高度应为
2*log(16)
8
。我一直在尝试绘制一棵高度
8
的红黑树,同时只使用
15
节点,但如果不打破红黑树的规则,我无法这样做。如何使用
15
节点创建高度为
8
的红黑树?

从CLR读取的伪代码。在应用任何旋转来更改颜色或平衡树之前,在树中新插入红色节点时,似乎可以达到最大高度。以下树演示了外部节点为3,最大高度为4的情况:

       black(h=4)
     /       \
   nul      red(h=3)
            /    \
          nul   red (h=2)
               /    \
             nul     nul (h=1)
然后,树将旋转并通过向左旋转来修复新插入的红色节点

       black(h=3)
     /       \
   red      red(h=2)
  /   \    /    \
 nul  nul nul   nul(h=1)

由此产生的高度降低并满足所有要求。

至少有两个原因导致h(根)≤ 2·log2(n+1)不产生严格的上限:

  • 它假定节点子节点的“黑色高度”比节点本身的“黑色高度”小一个。这是一种简化,因为它很可能是相同的(当节点为黑色且具有红色子节点时)

    因此,内部节点的数量得到了一个下限,该下限没有实际情况下的高,因此最大高度(由此导出)也没有实际情况下的低

  • 它并没有使用黑红树必须遵守的所有约束

    它使用的属性是根是黑色的,红色节点不能有红色子节点,因此“从根到叶的任何路径上至少有一半的节点是黑色的”

    但是。。。它没有考虑到从根到任何叶子的路径都必须具有相同数量的黑色节点的限制

    这个约束对树的可能高度施加了额外的限制,这个证明忽略了这一点


  • 然而,证明的目的不是要有一个尽可能严格的上限,而是要有一个足够好的上限,以得出h(root)=O(log(n))

    2log(16)不是8的结论。@500 InternalServerError我假设OP的意思是log-base-2,而不是log-base-10,正如人们通常对二叉树所做的那样,这个公式是高度的上限,但实际上并没有计算出可达到的最大值height@Dukeling:我来自哪里,log2(16)=4。@500 InternalServerError是的,所以2log2(16)=8。