堆何时成为完整的二叉树?

时间:2013-05-16 06:27:32

标签: tree heap binary-tree binary-heap

我知道堆总是完整的二叉树。但我想知道什么时候堆是一个完整的二叉树?例如,堆必须始终是一个完整的二叉树?

1 个答案:

答案 0 :(得分:0)

要说明堆条件不重要的原因,请考虑通过简单地为每个节点分配其高度,很容易为任何二进制树提供标记以满足堆条件。 (如果你想要唯一的标签,你可以在拓扑上对树进行排序并从根开始计数。)

因此,完整性和丰满度也是堆的正交概念(对于完整,完整,两者都没有的树的例子,请查看here。)

但是,堆实现通常选择以完成生成的二叉树的方式确保堆条件。实现普通二进制堆的一种标准方法是使用一个数组,然后用一个隐式二进制堆从左到右填充它(这通常是实现heapsort的方式)。

如果这是你所指的那种堆,那么约束会显着收紧,因为你总是从左到右一次填充树一层。很明显为什么这样的树是完整的(所有级别,但最后一个都是完全填充的)。

还应该很容易看出,它总是在完整和非完整之间交替:

  • 如果它只有根,则它已满。
  • 如果将节点添加到完整树,则其父节点必须只有一个(左)子节点,因此树将不再满。
  • 如果您的树不再满了,下一次插入将使其再次填满,因为它将作为您在上一步中给予左子的父级的(右)子项插入。