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恰好位于正确的位置。