我需要确定数组是否是有效的最小堆。如果不是,哪些值不合适?我对堆已经很困惑,所以这对我来说很难。有人可以向我解释一下吗?
[0,6,2,26,24,22,20,48,46,44]
答案 0 :(得分:1)
在基于数组的最小堆中,项目存储在完整的二叉树中。假设基于0的数组,这意味着索引i
中项目的左子项将位于索引2i + 1
中,右项将位于索引2i + 2
中。
最小堆不变量是每个节点小于其后代。因此,为了检查堆是否合法,您需要做的就是遍历所有内部节点并确保此条件成立,即对于索引i中的每个内部堆节点a[i] < a[2*i + 1] && a[i] < a[2*i + 2]
。
答案 1 :(得分:0)
如果有帮助,这是您的堆以更加图形化的形式。不变量是每个父母都比其子女少。
0
6 2
26 24 22 20
48 46 44
正如您所看到的,每个节点都大于其父节点,因此这是一个有效的最小堆。
答案 2 :(得分:0)