删除最小堆中的第 i 个索引

Deleting ith index in minimum heap

本文关键字:索引 删除      更新时间:2023-10-16

有人可以解释一下删除由数组表示的最小堆中的第 i 个元素并在删除操作后维护堆属性的概念。

第 i 个节点的左子节点:2*i + 1

第 i 个节点的右子节点:2*i + 2

第 i 个节点的父节点:(i-1)/2

这就是我尝试的方式,但这并不能正确处理所有条件:

void deleteKey(int i)
{
if(i > capacity && i < 0)  //capacity : max size of heap
return;
heap_size--;               //current heap size
//swapping last & required elements
harr[heap_size] = harr[heap_size] ^ harr[i];  //harr[] : heap array
harr[i] = harr[heap_size] ^ harr[i];     
harr[heap_size] = harr[heap_size] ^ harr[i];
int j = heap_size - 1;
while(2*i <= j)
{
if(left(i)<= j)  //if there's only left node
{
if(right(i) <= j)  //if there is right too
{
//finds index with min value
int x = harr[left(i)] < harr[right(i)] ? left(i) : right(i);
//swaps array elements
swap(&harr[x] , &harr[i]);
//updating current & required node
i = x;
}
else
{
swap(&harr[left(i)], &harr[i]);
i = left(i); //updating current & required node
}
}
}
}

这是我散步时得到的最美丽的解释。求道者们,看看吧!

这里有一个非常好的解决方案。只需检查最小堆的删除操作。

http://www.geeksforgeeks.org/binary-heap/