我一直在教自己为考试做好准备并遇到了以下问题:
"给出以下二元树不是堆的两个不同原因"
91
/ \
77 46
/ \ \
68 81 11
我知道其中一个原因是因为堆的孩子必须小于或等于其父级的值,因此81
违反此规则81 > 77
,但我不是确定在另一个答案。
请有人澄清一下吗?
答案 0 :(得分:5)
11
应该是46
的左子,而不是右子。
Wikipedia提到二进制堆应该是complete binary tree,这意味着“除了可能是最后一个级别之外,每个级别都被完全填满,所有节点都尽可能地离开< / strong>“,如果11
现在就是这样的话,情况显然不是这样。
这是有利的原因相当容易理解 - 考虑到堆的大小,您可以快速确定底层最后一个节点的位置,这对于插入和删除是必要的。如果我们使用数组表示,那么就像heap size - 1
中的元素是最后一个元素一样简单。对于基于指针的表示,我们可以轻松确定是向左还是向右移动到最后一个元素。
如果堆不是完整的二叉树,可能还有其他方法可以获得相同的性能,但它们可能会增加复杂性。
答案 1 :(得分:3)
这不是堆,因为它不符合堆属性。
它显然不是一个小堆,因为根节点91大于它的任何一个子节点。 并且它显然不是最大堆,因为节点77小于其右子,81。
而且,正如@Dukeling在答案中指出的那样,它并不符合形状属性。