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

时间:2017-08-14 13:44:47

标签: c++ data-structures 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
        }
     }
  }
}

2 个答案:

答案 0 :(得分:0)

这里提供了一个非常好的解决方案。只需检查min heap的删除操作。

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

答案 1 :(得分:0)

This是我在漫步时遇到的最美妙的解释。寻求者,看一看!