小根堆是一种特殊的完全二叉树,其中每个节点的值都小于或等于其子节点的值。在实现中,通常左孩子小于右孩子。小根堆的主要操作包括插入(push)和删除(pop)。
插入(push)
将新元素添加到堆的末尾。
从新元素的位置开始,向上移动到堆顶,并在每个节点处检查是否满足小根堆的条件(即父节点的值小于或等于其子节点的值)。如果不满足,则交换节点值,直到满足条件或到达堆顶。
删除(pop)
移除堆顶元素(即最小值)。
将堆的最后一个元素移到堆顶。
从堆顶开始,向下移动到合适的位置,并在每个节点处检查是否满足小根堆的条件。如果不满足,则交换节点值,直到满足条件或到达叶子节点。
小根堆在算法中有广泛的应用,例如在Dijkstra算法中用于选择当前最小距离的节点,或在Huffman树构建中用于合并权重最小的节点。
```cpp
include include include using namespace std; class MinHeap { private: priority_queue public: void push(int x) { heap.push(x); } void pop() { heap.pop(); } int top() { return heap.top(); } bool empty() { return heap.empty(); } size_t size() { return heap.size(); } }; int main() { MinHeap minHeap; minHeap.push(3); minHeap.push(1); minHeap.push(4); minHeap.push(1); minHeap.push(5); while (!minHeap.empty()) { cout << "Popped: " << minHeap.top() << endl; minHeap.pop(); } return 0; } ``` 在这个示例中,我们使用了C++标准库中的`priority_queue`来实现小根堆。`priority_queue`默认是一个最大堆,但我们通过传递`greater