有效的最小堆

时间:2015-04-06 22:32:13

标签: c++ heap

我需要确定数组是否是有效的最小堆。如果不是,哪些值不合适?我对堆已经很困惑,所以这对我来说很难。有人可以向我解释一下吗?

[0,6,2,26,24,22,20,48,46,44]

3 个答案:

答案 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)

堆可以实现为数组,因为单元格之间的顺序为this。现在,您应该遍历堆,每次访问节点时,根据heap的要求验证它是否大于其父节点。