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
做了什么? (我需要知道做一个家庭作业,在那里我应该编写删除堆中某个键的函数。)
答案 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进行比较来实现。
希望这会有所帮助:)