Dada uma representação da matriz de Min Heap, converta -a em pilhagem máxima.
Exemplos:
Entrada: arr [] = {3 5 9 6 8 20 10 12 18 9}
3
/
5 9
//
6 8 20 10
/ / /
12 18 9Saída: arr [] = {20 18 10 12 9 9 3 5 6 8}
20
/
18 10
//
12 9 3
/ / /
5 6 8Entrada: arr [] = {3 4 8 11 13}
Saída: arr [] = {13 11 8 4 3}
A idéia é simplesmente construir pilhagem máxima sem se preocupar com a entrada. Comece a partir do nó interno mais baixo e mais à direita de Min-heap e intensificar todos os nós internos da maneira de baixo para cima para construir a pilha máxima.
Siga as etapas fornecidas para resolver o problema:
- Chame a função Heapify do nó interno mais à direita de Min-Heap
- Heapify todos os nós internos da maneira de baixo para cima para construir o Max Heap
- Imprima o max-heap
Algoritmo: Aqui está um algoritmo para converter uma pilha min em uma pilha máxima :
- Comece no último nó não folhas da pilha (ou seja, o pai do último nó da folha). Para um monte binário, este nó está localizado no piso do índice ((n - 1)/2), onde n é o número de nós na pilha.
- Para cada nó não folhas, execute um 'Heapify' operação para corrigir a propriedade Heap. Em um mínimo, essa operação envolve verificar se o valor do nó é maior que o de seus filhos e se trocar o nó com o menor de seus filhos. Em um monte máximo, a operação envolve verificar se o valor do nó é menor que o de seus filhos e se trocar o nó com o maior de seus filhos.
- Repita a etapa 2 para cada um dos nós que não são de folhas que trabalham na pilha. Quando você atingir a raiz da pilha, todo o heap agora deve ser uma pilha máxima.
Abaixo está a implementação da abordagem acima:
C++// A C++ program to convert min Heap to max Heap #include using namespace std; // to heapify a subtree with root at given index void MaxHeapify(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]); MaxHeapify(arr largest N); } } // This function basically builds max heap void convertMaxHeap(int arr[] int N) { // Start from bottommost and rightmost // internal node and heapify all internal // nodes in bottom up way for (int i = (N - 2) / 2; i >= 0; --i) MaxHeapify(arr i N); } // A utility function to print a given array // of given size void printArray(int* arr int size) { for (int i = 0; i < size; ++i) cout << arr[i] << ' '; } // Driver's code int main() { // array representing Min Heap 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); // Function call convertMaxHeap(arr N); printf('nMax Heap array : '); printArray(arr N); return 0; }
C // C program to convert min Heap to max Heap #include void swap(int* a int* b) { int temp = *a; *a = *b; *b = temp; } // to heapify a subtree with root at given index void MaxHeapify(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]); MaxHeapify(arr largest N); } } // This function basically builds max heap void convertMaxHeap(int arr[] int N) { // Start from bottommost and rightmost // internal node and heapify all internal // nodes in bottom up way for (int i = (N - 2) / 2; i >= 0; --i) MaxHeapify(arr i N); } // A utility function to print a given array // of given size void printArray(int* arr int size) { for (int i = 0; i < size; ++i) printf('%d ' arr[i]); } // Driver's code int main() { // array representing Min Heap 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); // Function call convertMaxHeap(arr N); printf('nMax Heap array : '); printArray(arr N); return 0; }
Java // Java program to convert min Heap to max Heap class GFG { // To heapify a subtree with root at given index static void MaxHeapify(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] and arr[largest] int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; MaxHeapify(arr largest N); } } // This function basically builds max heap static void convertMaxHeap(int arr[] int N) { // Start from bottommost and rightmost // internal node and heapify all internal // nodes in bottom up way for (int i = (N - 2) / 2; i >= 0; --i) MaxHeapify(arr i N); } // A utility function to print a given array // of given size static void printArray(int arr[] int size) { for (int i = 0; i < size; ++i) System.out.print(arr[i] + ' '); } // driver's code public static void main(String[] args) { // array representing Min Heap int arr[] = { 3 5 9 6 8 20 10 12 18 9 }; int N = arr.length; System.out.print('Min Heap array : '); printArray(arr N); // Function call convertMaxHeap(arr N); System.out.print('nMax Heap array : '); printArray(arr N); } } // Contributed by Pramod Kumar
Python3 # A Python3 program to convert min Heap # to max Heap # to heapify a subtree with root # at given index def MaxHeapify(arr i N): l = 2 * i + 1 r = 2 * i + 2 largest = i if l < N and arr[l] > arr[i]: largest = l if r < N and arr[r] > arr[largest]: largest = r if largest != i: arr[i] arr[largest] = arr[largest] arr[i] MaxHeapify(arr largest N) # This function basically builds max heap def convertMaxHeap(arr N): # Start from bottommost and rightmost # internal node and heapify all # internal nodes in bottom up way for i in range(int((N - 2) / 2) -1 -1): MaxHeapify(arr i N) # A utility function to print a # given array of given size def printArray(arr size): for i in range(size): print(arr[i] end=' ') print() # Driver Code if __name__ == '__main__': # array representing Min Heap arr = [3 5 9 6 8 20 10 12 18 9] N = len(arr) print('Min Heap array : ') printArray(arr N) # Function call convertMaxHeap(arr N) print('Max Heap array : ') printArray(arr N) # This code is contributed by PranchalK
C# // C# program to convert // min Heap to max Heap using System; class GFG { // To heapify a subtree with // root at given index static void MaxHeapify(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] and arr[largest] int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; MaxHeapify(arr largest n); } } // This function basically // builds max heap static void convertMaxHeap(int[] arr int n) { // Start from bottommost and // rightmost internal node and // heapify all internal nodes // in bottom up way for (int i = (n - 2) / 2; i >= 0; --i) MaxHeapify(arr i n); } // A utility function to print // a given array of given size static void printArray(int[] arr int size) { for (int i = 0; i < size; ++i) Console.Write(arr[i] + ' '); } // Driver's Code public static void Main() { // array representing Min Heap int[] arr = { 3 5 9 6 8 20 10 12 18 9 }; int n = arr.Length; Console.Write('Min Heap array : '); printArray(arr n); // Function call convertMaxHeap(arr n); Console.Write('nMax Heap array : '); printArray(arr n); } } // This code is contributed by nitin mittal.
JavaScript <script> // javascript program to convert min Heap to max Heap // To heapify a subtree with root at given index function MaxHeapify(arr i n) { var l = 2*i + 1; var r = 2*i + 2; var 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] and arr[largest] var temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; MaxHeapify(arr largest n); } } // This function basically builds max heap function convertMaxHeap(arr n) { // Start from bottommost and rightmost // internal node and heapify all internal // nodes in bottom up way for (i = (n-2)/2; i >= 0; --i) MaxHeapify(arr i n); } // A utility function to print a given array // of given size function printArray(arr size) { for (i = 0; i < size; ++i) document.write(arr[i]+' '); } // driver program // array representing Min Heap var arr = [3 5 9 6 8 20 10 12 18 9]; var n = arr.length; document.write('Min Heap array : '); printArray(arr n); convertMaxHeap(arr n); document.write('
Max Heap array : '); printArray(arr n); // This code is contributed by 29AjayKumar </script>
PHP // A PHP program to convert min Heap to max Heap // utility swap function function swap(&$a&$b) { $tmp=$a; $a=$b; $b=$tmp; } // to heapify a subtree with root at given index function MaxHeapify(&$arr $i $n) { $l = 2*$i + 1; $r = 2*$i + 2; $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]); MaxHeapify($arr $largest $n); } } // This function basically builds max heap function convertMaxHeap(&$arr $n) { // Start from bottommost and rightmost // internal node and heapify all internal // nodes in bottom up way for ($i = (int)(($n-2)/2); $i >= 0; --$i) MaxHeapify($arr $i $n); } // A utility function to print a given array // of given size function printArray($arr $size) { for ($i = 0; $i <$size; ++$i) print($arr[$i].' '); } // Driver code // array representing Min Heap $arr = array(3 5 9 6 8 20 10 12 18 9); $n = count($arr); print('Min Heap array : '); printArray($arr $n); convertMaxHeap($arr $n); print('nMax Heap array : '); printArray($arr $n); // This code is contributed by mits ?>
Saída
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
Complexidade do tempo: O (n) Para detalhes, consulte: Complexidade do tempo de construção de uma pilha
Espaço auxiliar: Sobre)