我知道堆总是完整的二叉树。但我想知道什么时候堆是一个完整的二叉树?例如,堆必须始终是一个完整的二叉树?
答案 0 :(得分:0)
要说明堆条件不重要的原因,请考虑通过简单地为每个节点分配其高度,很容易为任何二进制树提供标记以满足堆条件。 (如果你想要唯一的标签,你可以在拓扑上对树进行排序并从根开始计数。)
因此,完整性和丰满度也是堆的正交概念(对于完整,完整,两者都没有的树的例子,请查看here。)
但是,堆实现通常选择以完成生成的二叉树的方式确保堆条件。实现普通二进制堆的一种标准方法是使用一个数组,然后用一个隐式二进制堆从左到右填充它(这通常是实现heapsort的方式)。
如果这是你所指的那种堆,那么约束会显着收紧,因为你总是从左到右一次填充树一层。很明显为什么这样的树是完整的(所有级别,但最后一个都是完全填充的)。
还应该很容易看出,它总是在完整和非完整之间交替: