并非所有的红黑树都是平衡的?


30

直观地,“平衡树”应该是每个节点的左右子树必须具有“大约相同”数目的节点的树。

当然,当我们谈论红黑树*(请参阅最后的定义)时,实际上是指它们在高度上是平衡的,从某种意义上说,它们是平衡的。

假设我们尝试将上述直觉形式化如下:

定义:二叉树被称为μ -balanced,具有0μ12,如果对于每个节点,不等式N

μ|NL|+1|N|+11μ

对于每个,都有一个节点,上面的语句失败。是和的左子树中的节点数。是树下以为根(包括根)的节点数。μ>μ|NL|N|N|N

我相信,在有关此主题的一些文献中,这些树被称为重量平衡树。

可以证明,如果具有节点的二叉树是平衡的(对于常数),那么树的高度是,因此保持了很好的搜索属性。nμμ>0O(logn)

所以问题是:

是否有一些使每个足够大的红黑树达到平衡?μ>0μ


我们使用的Red-Black树的定义(来自Cormen等人的Introduction to Algorithms):

二进制搜索树,其中每个节点的颜色为红色或黑色,

  • 根是黑色的
  • 所有NULL节点均为黑色
  • 如果节点为红色,则其两个子节点均为黑色。
  • 对于每个节点,从该节点到后代NULL节点的所有路径都具有相同数量的黑色节点。

注意:在上面的 balanced 的定义中,我们不计算NULL节点。(尽管我相信这是否重要)。μ


@Aryabhata:编辑中的唯一性()是什么?我对以下事实很满意:1μ>μ平衡表示11个3平衡。我认为您不必找出确切的μ即可证明高度为Ologn。我想念什么吗?1个4 μØ日志ñ
jmad 2012年

此外,您还需要负语句来提供反链一棵树,每。任何不减小节点大小的无限链就足够了,不是吗?nN
拉斐尔

@jmad:如果不进行编辑,那么每棵树都是0平衡的,因此我们对该问题没有任何答案。我想避免这种情况。μ0
Aryabhata'3

@Raphael:我不明白。树的节点大小为n。你说没关系什么树,我们挑选[R ñμ ñ0?对我来说似乎并不明显,那就是问题所在!ñŤHñ[Rñμñ0
Aryabhata 2012年

1
这个问题的较早版本声称,在每一步执行线性工作量的红黑树上,递归算法的运行时间不一定是。该说法不正确;height-balance表示一棵n节点红黑树的深度O log n 。因此,如果您在树的每个级别上执行O n 功,则总功为O n log n Øñ日志ññØ日志ñØñØñ日志ñ
JeffE 2012年

Answers:


31

权利要求:红黑树可以是任意非μ -balanced。

证明思想:对于每个根叶子路径上给定数目的ķ个黑色节点,在右子树中填充尽可能多的节点,在左子树中填充尽可能少的节点。

证明:定义一个红黑树序列Ťķ,以便Ťķ在从根到任何(虚拟)叶的每条路径上都有ķ黑节点。限定Tk=B(Lk,Rk)

  • Rk高度完整的树2k1彩色红,别人黑的第一,第三,......水平,
  • Lk是高度为k1的完整树,所有节点都涂成黑色。

显然,所有Tk都是红黑树。

例如,这些分别是T1T2T3


T_1
[ 来源 ]


T_2
[ 来源 ]


T_3
[ 来源 ]


现在让我们验证右侧是视觉印象巨大相比左侧。我不会数虚拟的树叶;它们不会影响结果。

Tk的左子树是完整的,并且始终具有高度k1个,因此包含2ķ-1个节点。右子树,在另一方面,是完整的,并且具有高度2ķ-1个正是如此含有22ķ-1个节点。现在根的μ balance值为

2ķ2ķ+22ķ=1个1个+2ķķ0

μ>0


14

不。 考虑具有以下特殊结构的红黑树。

  • d
  • 2d

22d+1个-1个2d+1个-1个


22d+1个+2d+1个-1个ñ

1
ñ

@JeffE:基本上,反例链将是“密集”子集,而不是“稀疏”子集。也许我将改变问题的表述。
Aryabhata 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.