简单的堆程序 - 这个变量做了什么

时间:2012-06-09 01:49:10

标签: c++ heap

void ReheapDown( int* heap, int top, int swpIndx, int numElements )  {
    int leftChild = 2 * top + 1;
    int rightChild = 2 * top + 2;
    int minChild;
    if (leftChild < numElements) {
        // find subscript of smallest child
        if (rightChild >= swpIndx || heap[leftChild] < heap[rightChild])
            minChild = leftChild;
        else
            minChild = rightChild;
        // if data at top is greater than smallest
        // child then swap and continue
        if (heap[top] > heap[minChild]) {
            swap( heap[top], heap[minChild] );
            ReheapDown( heap, minChild, swpIndx, numElements );
        }
    }

这是一个简单的堆。 ReheapDown部分用于删除堆中的项目。 swpIndx做了什么? (我需要知道做一个家庭作业,在那里我应该编写删除堆中某个键的函数。)

1 个答案:

答案 0 :(得分:1)

要从堆中删除密钥,我们可能希望在删除密钥之前将其与堆中的最后一个密钥交换,否则堆中会出现一个漏洞。

但是,将最后一个节点与我们要删除的节点进行交换可能会破坏堆的排序,这就是您提供的 ReheapDown 方法所在的位置。

我相信 swpIndex 参数是我们放置了我们希望删除的元素的索引。所以代码的一部分基本上说:

if (there exists a left child) {
    if (there is no right child || left child < right child)
        minChild <- left child
    else
        minChild <- right child
}

我认为这个参数是不必要的,因为它似乎唯一的目的是检查左右孩子的存在;这也可以通过将leftChild和rightChild索引与numElements进行比较来实现。

希望这会有所帮助:)