最大堆
下面是一个完整的C++实现手写最大堆的代码。最大堆是一种完全二叉树,其中每个节点的值都大于或等于其子节点的值。
参考代码
#include <iostream>
#include <vector>
#include <stdexcept>
class MaxHeap {
private:
std::vector<int> heap;
// 获取父节点索引
int parent(int i) {
return (i - 1) / 2;
}
// 获取左子节点索引
int leftChild(int i) {
return 2 * i + 1;
}
// 获取右子节点索引
int rightChild(int i) {
return 2 * i + 2;
}
// 上浮操作
void heapifyUp(int i) {
while (i > 0 && heap[parent(i)] < heap[i]) {
std::swap(heap[parent(i)], heap[i]);
i = parent(i);
}
}
// 下沉操作
void heapifyDown(int i) {
int maxIndex = i;
int left = leftChild(i);
int right = rightChild(i);
if (left < heap.size() && heap[left] > heap[maxIndex]) {
maxIndex = left;
}
if (right < heap.size() && heap[right] > heap[maxIndex]) {
maxIndex = right;
}
if (i != maxIndex) {
std::swap(heap[i], heap[maxIndex]);
heapifyDown(maxIndex);
}
}
public:
// 插入元素
void insert(int value) {
heap.push_back(value);
heapifyUp(heap.size() - 1);
}
// 获取最大元素
int getMax() {
if (heap.empty()) {
throw std::out_of_range("Heap is empty");
}
return heap[0];
}
// 删除最大元素
void extractMax() {
if (heap.empty()) {
throw std::out_of_range("Heap is empty");
}
heap[0] = heap.back();
heap.pop_back();
heapifyDown(0);
}
// 打印堆
void print() {
for (int i : heap) {
std::cout << i << " ";
}
std::cout << std::endl;
}
};
int main() {
MaxHeap maxHeap;
maxHeap.insert(10);
maxHeap.insert(5);
maxHeap.insert(15);
maxHeap.insert(2);
maxHeap.insert(20);
std::cout << "Max heap: ";
maxHeap.print();
std::cout << "Max element: " << maxHeap.getMax() << std::endl;
maxHeap.extractMax();
std::cout << "Max heap after extractMax: ";
maxHeap.print();
return 0;
}
代码说明
堆的存储:使用std::vector来存储堆中的元素。
辅助函数:
parent(int i):获取索引i的父节点索引。
leftChild(int i):获取索引i的左子节点索引。
rightChild(int i):获取索引i的右子节点索引。
上浮操作:heapifyUp(int i)用于在插入新元素后,将元素上浮到正确的位置,以维护堆的性质。
下沉操作:heapifyDown(int i)用于在删除最大元素后,将新的根元素下沉到正确的位置,以维护堆的性质。
插入操作:insert(int value)将新元素插入堆中,并调用heapifyUp维护堆的性质。
获取最大元素:getMax()返回堆中的最大元素(即根节点)。
删除最大元素:extractMax()删除堆中的最大元素,并调用heapifyDown维护堆的性质。
打印堆:print()函数用于打印堆中的所有元素。
输出结果
Max heap: 20 15 10 2 5
Max element: 20
Max heap after extractMax: 15 5 10 2