Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有效最小堆_C++_Heap - Fatal编程技术网

C++ 有效最小堆

C++ 有效最小堆,c++,heap,C++,Heap,我需要确定数组是否是有效的最小堆。如果不是,哪些值不合适?我已经对堆感到困惑,所以这对我来说很困难。谁能给我解释一下吗 [0,6,2,26,24,22,20,48,46,44]在基于数组的最小堆中,项目存储在完整的二叉树中。假设一个基于0的数组,这意味着索引i中项的左子项将在索引2i+1中,右子项将在索引2i+2中 最小堆不变量是每个节点都比其子节点小。因此,为了检查堆是否合法,您需要做的就是遍历所有内部节点并确保此条件成立,即对于索引i中的每个内部堆节点,a[i]

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


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

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


最小堆不变量是每个节点都比其子节点小。因此,为了检查堆是否合法,您需要做的就是遍历所有内部节点并确保此条件成立,即对于索引i中的每个内部堆节点,
a[i]
如果有帮助,这里是以更图形化的形式显示的堆。不变的是,每个父项都小于其两个子项

            0
      6           2
  26     24   22     20
48  46 44

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

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

我现在理解了这个问题。但是,现在我必须从最小堆初始配置中添加和删除:[0,2,4,6,8,10,12,14]插入1删除4删除0插入3我认为插入1将产生[0,1,4,2,8,10,12,14,6]@WilliamDiuguid:Insert意味着“附加到数组末尾并在父级大于自身时与父级交换”,这与您的示例相符。Remove的意思是“将根节点与最后一个元素交换,并将该元素与其最小的子元素交换,直到它是一片叶子或小于其子元素”。移除4将是[0,1,6,2,8,10,12,14],因为被替换的6恰好位于正确的位置。