二叉树的平均高度是多少?


10

关于二叉树的平均高度是否有正式定义?

我有一个有关使用以下两种方法查找二叉树的平均高度的教程问题:

  1. 自然的解决方案可能是取从根到叶的所有可能路径的平均长度,即

    Avh1个Ť=1个#留在 Ťv 的叶 Ť深度v

  2. 另一种选择是递归定义它,即节点的平均高度是子树的平均高度加一的平均值,即

    Avh2ñ[R=Avh2+Avh2[R2+1个

    与对于叶子和为空时隙。l avh 2_ = 0Avh2=1个Avh2_=0

根据我目前的理解,例如树的平均高度Ť

    1    
   / \
  2   3
 /
4

第二种方法是,即使用递归。Avh2Ť=1.25

但是,我还是不太了解如何做第一个。不正确。Avh1个Ť=1个+2/2=1.5


1
你能提供一些背景吗?没有“正确的”数学定义。您可以根据需要定义“二叉树的平均高度”。(平均什么什么分布?),但不同的定义都会或多或少有用不同的应用。
JeffE 2012年

@JeffE“如何立即定义二叉树的平均高度还不是很明显。也许最自然的解决方案可能是拥有从根到叶的可能路径的平均长度。更简单(甚至是简单的)的解决方案就是说,一个节点的平均高度是子树的平均高度加1的平均值。您发现发现编写这种替代方案更容易。您可以举一些例子来说明差异吗?”
永恒的2012年

我试图通过给出两个变体的精确定义来使您的帖子更加清晰。请检查我是否正确解释了您的文字。特别是,您缺少第二个变体的锚点;您是否将叶子的高度设为1或0都会有所不同。
拉斐尔

Answers:


3

没有理由相信这两个定义都描述了相同的度量。您也可以递归地编写Avh1个

Avh1个ñ[R=lv一个vH1个+1个+lv[R一个vH1个[R+1个lv+lv[R

对于叶具有。如果您不认为这是相同的,请在右侧展开的定义,或进行归纳证明。Avh1个=0Avh1个

现在我们看到工作方式与完全不同。虽然重一个节点的孩子们的递归高度相等(添加和除以二),根据它们包含叶子的数量重它们。因此,对于叶子平衡的树木,它们是相同的(以锚为模),在兄弟姐妹树木具有相等的叶子的意义上是平衡的。如果您用简化的递归形式,这将很明显。但是,在不平衡的树上,它们是不同的。Avh1个Avh2Avh2Avh1个Avh1个lv=lv[R

您的计算确实正确(根据您的定义);请注意,示例树不是叶平衡的。


是否有可能显示的实现代码,但我不太了解如何递归执行Avh1个
永恒的

@null:对不起,我不明白这个问题。您是说要证明的递归定义与您的等效吗?Avh1个
拉斐尔

我的意思是使用递归的实现代码
永恒的

@null:只要合并基本情况,就可以几乎按原样复制公式。如何做到这一点完全取决于您的编程语言和树的实现。如果实现对您来说是一个障碍,我建议您将堆栈溢出重现。
拉斐尔

2

编辑:杰夫在上面的评论中提到了一个很好的观点。您可能应该在以下答案中将“正确与不正确”读为“方便/一致与不一致”。

您的第二次计算似乎不正确。假设具有单个节点(即叶)的子树的高度为0。则子树根的高度为:

  • 4的高度是0
  • 3处的高度为0
  • 2处的高度是3 +1 = 0 +1 = 1时的平均高度
  • 1处的高度是2和3处的高度的平均值=(0 + 1)/ 2 + 1 = 1.5

我认为您正确地进行了第一个计算,而1.5是正确的答案。


这个想法是高度为-1的空节点,基于第二种方法,一个节点的平均高度是子树的平均值加1,节点4的平均高度是((-1)+(-1))/ 2 + 1 = 0 ,节点2的平均高度为(0 +(-1))/ 2 + 1 = 0.5,因此根的平均高度为1.25。
永恒的2012年

@null如果您坚持可以用这种方式定义它,但是这两个定义将不一致。
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.