有效的最小堆数

Valid Min Heaps

本文关键字:有效      更新时间:2023-10-16

我需要确定数组是否是有效的最小堆。如果不是,哪些价值观是不合时宜的?我已经对成堆的东西感到困惑了,所以这对我来说很困难。有人能给我解释一下吗?

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

在基于数组的最小堆中,项存储在一个完整的二进制树中。假设是一个基于0的数组,这意味着索引i中项目的左子项将在索引2i + 1中,右子项将位于索引2i + 2中。

最小堆不变量是每个节点都小于其子节点。因此,为了检查堆是否合法,您所需要做的就是遍历所有内部节点,并确保此条件成立,即对于索引i中的每个内部堆节点,a[i] < a[2*i + 1] && a[i] < a[2*i + 2]

如果有帮助的话,下面是一个更图形化的堆。不变的是,每个父项都小于其两个子项。

            0
      6           2
  26     24   22     20
48  46 44

正如您所看到的,每个节点都大于其父节点,因此这是一个有效的最小堆。

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