Trong hướng dẫn này, chúng ta sẽ thảo luận về chương trình chuyển đổi Min Heap sang Max Heap với độ phức tạp thời gian O(n).
Ý tưởng chính
Cho biểu diễn mảng của Min Heap. Nhiệm vụ là chuyển đổi mảng đó thành Max Heap. Ta sử dụng phương pháp heapify từ dưới lên (bottom-up) bắt đầu từ nút cha cuối cùng.
Ví dụ minh họa
#include <bits/stdc++.h>
using namespace std;
// Heapify một cây con tại chỉ số i
void convert_arrayheap(int arr[], int i, int n) {
int l = 2*i + 1;
int r = 2*i + 2;
int largest = i;
if (l < n && arr[l] > arr[i])
largest = l;
if (r < n && arr[r] > arr[largest])
largest = r;
if (largest != i) {
swap(arr[i], arr[largest]);
convert_arrayheap(arr, largest, n);
}
}
// Xây dựng Max Heap từ mảng
void convert_maxheap(int arr[], int n) {
// Heapify tất cả các nút không phải lá
for (int i = (n-2)/2; i >= 0; --i)
convert_arrayheap(arr, i, n);
}
void printArray(int* arr, int size) {
for (int i = 0; i < size; ++i)
printf("%d ", arr[i]);
}
int main() {
int arr[] = {3, 5, 9, 6, 8, 20, 10, 12, 18, 9};
int n = sizeof(arr)/sizeof(arr[0]);
printf("Min Heap array : ");
printArray(arr, n);
convert_maxheap(arr, n);
printf("\nMax Heap array : ");
printArray(arr, n);
return 0;
}
Kết quả
Min Heap array : 3 5 9 6 8 20 10 12 18 9 Max Heap array : 20 18 10 12 9 9 3 5 6 8
Giải thích: Mảng đầu tiên thỏa mãn tính chất Min Heap (cha ≤ con). Sau khi gọi convert_maxheap, mảng được sắp xếp lại để thỏa mãn Max Heap (cha ≥ con). Độ phức tạp O(n) nhờ heapify từ dưới lên.