【发布时间】:2018-01-22 09:05:31
【问题描述】:
谁能解释一下删除由数组表示的最小堆中的第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
}
}
}
}
【问题讨论】:
-
“2*1 + 1”是“2 * i + 1”?
-
有人能解释一下删除以数组表示的最小堆中的第i个元素并在删除操作后保持堆属性的概念 -- 你不知道一个概念,但是您编写了一个程序来实现您想要解释的概念。令人困惑...
-
@PaulMcKenzie 感谢您对我的努力表示赞赏。是的,我还在学习。当我完成这段代码后,我会告诉你:)
-
数组索引用于回溯
-
您尝试的示例输入是什么以及您是如何得出结论它不起作用的
标签: c++ data-structures heap