diff options
Diffstat (limited to 'src/common/binaryheap.c')
-rw-r--r-- | src/common/binaryheap.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/common/binaryheap.c b/src/common/binaryheap.c index 39a8243a6d5..19e095f1fb1 100644 --- a/src/common/binaryheap.c +++ b/src/common/binaryheap.c @@ -216,6 +216,35 @@ binaryheap_remove_first(binaryheap *heap) } /* + * binaryheap_remove_node + * + * Removes the nth (zero based) node from the heap. The caller must ensure + * that there are at least (n + 1) nodes in the heap. O(log n) worst case. + */ +void +binaryheap_remove_node(binaryheap *heap, int n) +{ + int cmp; + + Assert(!binaryheap_empty(heap) && heap->bh_has_heap_property); + Assert(n >= 0 && n < heap->bh_size); + + /* compare last node to the one that is being removed */ + cmp = heap->bh_compare(heap->bh_nodes[--heap->bh_size], + heap->bh_nodes[n], + heap->bh_arg); + + /* remove the last node, placing it in the vacated entry */ + heap->bh_nodes[n] = heap->bh_nodes[heap->bh_size]; + + /* sift as needed to preserve the heap property */ + if (cmp > 0) + sift_up(heap, n); + else if (cmp < 0) + sift_down(heap, n); +} + +/* * binaryheap_replace_first * * Replace the topmost element of a non-empty heap, preserving the heap |