如何检查数组是否为最小堆?

时间:2016-07-28 03:53:16

标签: c++ algorithm heap

我有以下数组。如何检查包含n个元素的数组是否为最小堆? enter image description here

3 个答案:

答案 0 :(得分:5)

由于索引从1开始,(索引0包含0 - 为什么?),您可以按如下方式确定给定节点子节点的索引:

  • 让给定节点的索引为i
  • i的左孩子的索引:2i
  • i右侧孩子的索引:2i + 1

因此,对于每个节点,您可以轻松检查两个子节点是否大于节点本身。

答案 1 :(得分:3)

is_heap是一个很好的建议。你只需要使用适当的比较器。您甚至可以毫不费力地将它与基于1的索引与迭代器一起使用:

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>

int main()
{
    std::vector<int> v {0, 5, 9, 11, 14, 18, 19 };
    std::cout << std::is_heap(
      v.begin()+1, // off by 1
      v.end(),
      std::greater<int>() // std::less is used by default for max-heap
    );
}

答案 2 :(得分:0)

熟悉的广度优先搜索(BFS)也可用于检查树是否是最小/最大堆。

groupCodeMapRowTemplate.html

这个想法与wookie919的想法类似。