为什么这个二叉树不是堆?

时间:2014-05-08 22:49:39

标签: data-structures heap

我一直在教自己为考试做好准备并遇到了以下问题:

"给出以下二元树不是堆的两个不同原因"

    91
   /  \
  77  46
 /  \   \
68  81   11

我知道其中一个原因是因为堆的孩子必须小于或等于其父级的值,因此81违反此规则81 > 77,但我不是确定在另一个答案。

请有人澄清一下吗?

2 个答案:

答案 0 :(得分:5)

11应该是46的左子,而不是右子。

Wikipedia提到二进制堆应该是complete binary tree,这意味着“除了可能是最后一个级别之外,每个级别都被完全填满,所有节点都尽可能地离开< / strong>“,如果11现在就是这样的话,情况显然不是这样。

这是有利的原因相当容易理解 - 考虑到堆的大小,您可以快速确定底层最后一个节点的位置,这对于插入和删除是必要的。如果我们使用数组表示,那么就像heap size - 1中的元素是最后一个元素一样简单。对于基于指针的表示,我们可以轻松确定是向左还是向右移动到最后一个元素。

如果堆不是完整的二叉树,可能还有其他方法可以获得相同的性能,但它们可能会增加复杂性。

答案 1 :(得分:3)

这不是堆,因为它不符合堆属性。

  • 在最小堆中,每个节点的值小于或等于其子节点&#39;值。
  • 在max-heap中,每个节点的值都大于或等于其子节点&#39;值。

它显然不是一个小堆,因为根节点91大于它的任何一个子节点。 并且它显然不是最大堆,因为节点77小于其右子,81。

而且,正如@Dukeling在答案中指出的那样,它并不符合形状属性。