删除最小堆中的第 i 个索引
Deleting ith index in minimum heap
有人可以解释一下删除由数组表示的最小堆中的第 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/
相关文章:
- 删除最小堆中的第 i 个索引
- 使用对象的索引从矢量中删除对象
- 如何通过索引中删除向量中的2个元素的每个倍数
- 从<string>向量<int>中定义的索引处的向量中删除字符串
- <T> 在使用运算符+ 连接两个向量之前从类型向量中删除索引
- 如何删除给定索引之间的所有元素
- 通过索引从向量中删除对象
- 双链表删除节点与索引C++
- 如何在删除一行后重新索引或修复rowid sqlite
- std::vector 删除重复项,然后删除另一个向量中的相同索引
- C++-从单链循环列表中的任何索引中删除一个节点
- 如何从结构数组中删除一个数据行?(带索引)
- 从std::vector中的特定索引中删除
- C++ 索引数组打印和删除字符串名称 数组打印
- 从给定索引处的向量中删除对象
- 删除字符*[] 中的第一个索引
- 删除 2 个给定索引之间的元素的最佳算法
- 通过索引删除一组元素
- 向量的向量.根据内部向量的特定索引删除重复项
- 根据索引删除向量元素