最小堆的建立
最小堆(Min Heap)是一種特殊的完全二叉樹,其中每個節點的值都不大於其父節點的值。最小堆可以用來實現優先佇列,其中堆頂總是當前序列中的最小元素。最小堆的建立通常涉及以下幾個步驟:
-
初始化堆:首先,你需要一個數組來存儲堆中的元素。數組的下標從0開始,數組的容量需要足夠大以存儲所有的元素。
-
堆化:將數組中的元素構建成最小堆的過程稱為堆化。這個過程通常從數組的最後一個非葉子節點開始,向上調整每個節點,直到根節點。
-
調整堆:當你向堆中添加新的元素或從堆中刪除元素時,堆的結構會被破壞,這時你需要調整堆,使其重新成為最小堆。
下面是一個簡單的C++代碼示例,用於建立一個最小堆:
#include <iostream>
#include <vector>
// 最小堆節點
struct MinHeapNode {
int data;
int left;
int right;
int parent;
};
// 最小堆
class MinHeap {
private:
int capacity;
int size;
MinHeapNode* heap;
public:
MinHeap(int capacity) : capacity(capacity), size(0), heap(new MinHeapNode[capacity]) {
// 初始化堆
for (int i = 0; i < capacity; i++) {
heap[i].data = 0;
heap[i].left = 2*i + 1;
heap[i].right = 2*i + 2;
heap[i].parent = (i-1) / 2;
}
}
// 調整堆
void adjustHeap(int i) {
// 交換當前節點和其父節點
if (heap[i].parent >= 0 && heap[heap[i].parent].data > heap[i].data) {
std::swap(heap[i].data, heap[heap[i].parent].data);
adjustHeap(heap[i].parent);
}
}
// 堆化
void heapify() {
// 從最後一個非葉子節點開始堆化
for (int i = (capacity - 2) / 2; i >= 0; i--) {
adjustHeap(i);
}
}
// 獲取堆頂元素
int top() {
return heap[0].data;
}
// 刪除堆頂元素
void pop() {
// 將最後一個元素移動到堆頂
heap[0] = heap[--size];
heap[0].parent = -1;
adjustHeap(0);
}
// 向堆中添加元素
void push(int data) {
heap[size++] = {data, -1, -1, -1};
adjustHeap(size - 1);
}
// 獲取堆的大小
int size() {
return size;
}
};
int main() {
MinHeap minHeap(10);
minHeap.push(10);
minHeap.push(5);
minHeap.push(1);
minHeap.push(7);
minHeap.push(3);
minHeap.heapify();
std::cout << "最小堆頂元素: " << minHeap.top() << std::endl;
minHeap.pop();
std::cout << "刪除堆頂元素後的最小堆頂元素: " << minHeap.top() << std::endl;
return 0;
}
這段代碼定義了一個最小堆類,其中包含了一些基本的操作,如添加元素、刪除堆頂元素、獲取堆頂元素和堆的大小。在main函式中,我們創建了一個容量為10的最小堆,並向其中添加了一些元素,然後調用heapify方法將堆結構調整為最小堆。最後,我們列印了堆頂元素,並刪除堆頂元素後再次列印堆頂元素。