Neste tutorial, você aprenderá o que é estrutura de dados heap. Além disso, você encontrará exemplos funcionais de operações de heap em C, C ++, Java e Python.
A estrutura de dados heap é uma árvore binária completa que satisfaz a propriedade heap . Também é chamado de heap binário .
Uma árvore binária completa é uma árvore binária especial na qual
- cada nível, exceto possivelmente o último, é preenchido
- todos os nós estão o mais à esquerda possível

Heap Property é a propriedade de um nó no qual
- (para o heap máximo) a chave de cada nó é sempre maior que seu (s) nó (s) filho (s) e a chave do nó raiz é a maior entre todos os outros nós;

- (para min heap) a chave de cada nó é sempre menor que o (s) nó (s) filho (s) e a chave do nó raiz é a menor entre todos os outros nós.

Operações de heap
Algumas das operações importantes realizadas em um heap são descritas a seguir, juntamente com seus algoritmos.
Heapify
Heapify é o processo de criação de uma estrutura de dados heap a partir de uma árvore binária. Ele é usado para criar um Min-Heap ou um Max-Heap.
- Deixe a matriz de entrada ser

- Crie uma árvore binária completa a partir do array

- Comece a partir do primeiro índice de nó não folha cujo índice é dado por
n/2 - 1.
- Defina o elemento atual
icomolargest. - O índice da criança esquerda é dado por
2i + 1e o da criança direita é dado por2i + 2.
SeleftChildfor maior quecurrentElement(ou seja, elemento noithíndice), definaleftChildIndexcomo o maior.
SerightChildfor maior do que o elemento emlargest, definarightChildIndexcomolargest. - Trocar
largestcomcurrentElement
- Repita as etapas 3 a 7 até que as subárvores também estejam empilhadas.
Algoritmo
Heapify(array, size, i) set i as largest leftChild = 2i + 1 rightChild = 2i + 2 if leftChild > array(largest) set leftChildIndex as largest if rightChild > array(largest) set rightChildIndex as largest swap array(i) and array(largest)
Para criar um Max-Heap:
MaxHeap(array, size) loop from the first index of non-leaf node down to zero call heapify
Para Min-Heap, leftChilde rightChilddeve ser menor que o pai para todos os nós.
Inserir elemento na pilha
Algoritmo para inserção em Max Heap
If there is no node, create a newNode. else (a node is already present) insert the newNode at the end (last node from left to right.) heapify the array
- Insira o novo elemento no final da árvore.

- Heapify a árvore.

Para Min Heap, o algoritmo acima é modificado para que parentNodeseja sempre menor que newNode.
Excluir elemento da pilha
Algoritmo para exclusão em Max Heap
If nodeToBeDeleted is the leafNode remove the node Else swap nodeToBeDeleted with the lastLeafNode remove noteToBeDeleted heapify the array
- Selecione o elemento a ser excluído.

- Troque-o pelo último elemento.

- Remova o último elemento.

- Heapify a árvore.

Para Min Heap, o algoritmo acima é modificado para que ambos childNodessejam maiores e menores que currentNode.
Peek (encontrar max / min)
A operação Peek retorna o elemento máximo de Max Heap ou o elemento mínimo de Min Heap sem excluir o nó.
Para heap máximo e heap mínimo
return rootNode
Extrair-Max / Min
Extract-Max retorna o nó com valor máximo após removê-lo de um Heap Máx, enquanto Extract-Min retorna o nó com valor mínimo após removê-lo de Min Heap.
Exemplos de Python, Java, C / C ++
Python Java C C ++ # Max-Heap data structure in Python def heapify(arr, n, i): largest = i l = 2 * i + 1 r = 2 * i + 2 if l < n and arr(i) < arr(l): largest = l if r < n and arr(largest) < arr(r): largest = r if largest != i: arr(i),arr(largest) = arr(largest),arr(i) heapify(arr, n, largest) def insert(array, newNum): size = len(array) if size == 0: array.append(newNum) else: array.append(newNum); for i in range((size//2)-1, -1, -1): heapify(array, size, i) def deleteNode(array, num): size = len(array) i = 0 for i in range(0, size): if num == array(i): break array(i), array(size-1) = array(size-1), array(i) array.remove(num) for i in range((len(array)//2)-1, -1, -1): heapify(array, len(array), i) arr = () insert(arr, 3) insert(arr, 4) insert(arr, 9) insert(arr, 5) insert(arr, 2) print ("Max-Heap array: " + str(arr)) deleteNode(arr, 4) print("After deleting an element: " + str(arr))
// Max-Heap data structure in Java import java.util.ArrayList; class Heap ( void heapify(ArrayList hT, int i) ( int size = hT.size(); int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l hT.get(largest)) largest = l; if (r hT.get(largest)) largest = r; if (largest != i) ( int temp = hT.get(largest); hT.set(largest, hT.get(i)); hT.set(i, temp); heapify(hT, largest); ) ) void insert(ArrayList hT, int newNum) ( int size = hT.size(); if (size == 0) ( hT.add(newNum); ) else ( hT.add(newNum); for (int i = size / 2 - 1; i>= 0; i--) ( heapify(hT, i); ) ) ) void deleteNode(ArrayList hT, int num) ( int size = hT.size(); int i; for (i = 0; i = 0; j--) ( heapify(hT, j); ) ) void printArray(ArrayList array, int size) ( for (Integer i : array) ( System.out.print(i + " "); ) System.out.println(); ) public static void main(String args()) ( ArrayList array = new ArrayList(); int size = array.size(); Heap h = new Heap(); h.insert(array, 3); h.insert(array, 4); h.insert(array, 9); h.insert(array, 5); h.insert(array, 2); System.out.println("Max-Heap array: "); h.printArray(array, size); h.deleteNode(array, 4); System.out.println("After deleting an element: "); h.printArray(array, size); ) )
// Max-Heap data structure in C #include int size = 0; void swap(int *a, int *b) ( int temp = *b; *b = *a; *a = temp; ) void heapify(int array(), int size, int i) ( if (size == 1) ( printf("Single element in the heap"); ) else ( int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l array(largest)) largest = l; if (r array(largest)) largest = r; if (largest != i) ( swap(&array(i), &array(largest)); heapify(array, size, largest); ) ) ) void insert(int array(), int newNum) ( if (size == 0) ( array(0) = newNum; size += 1; ) else ( array(size) = newNum; size += 1; for (int i = size / 2 - 1; i>= 0; i--) ( heapify(array, size, i); ) ) ) void deleteRoot(int array(), int num) ( int i; for (i = 0; i = 0; i--) ( heapify(array, size, i); ) ) void printArray(int array(), int size) ( for (int i = 0; i < size; ++i) printf("%d ", array(i)); printf(""); ) int main() ( int array(10); insert(array, 3); insert(array, 4); insert(array, 9); insert(array, 5); insert(array, 2); printf("Max-Heap array: "); printArray(array, size); deleteRoot(array, 4); printf("After deleting an element: "); printArray(array, size); )
// Max-Heap data structure in C++ #include #include using namespace std; void swap(int *a, int *b) ( int temp = *b; *b = *a; *a = temp; ) void heapify(vector &hT, int i) ( int size = hT.size(); int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l hT(largest)) largest = l; if (r hT(largest)) largest = r; if (largest != i) ( swap(&hT(i), &hT(largest)); heapify(hT, largest); ) ) void insert(vector &hT, int newNum) ( int size = hT.size(); if (size == 0) ( hT.push_back(newNum); ) else ( hT.push_back(newNum); for (int i = size / 2 - 1; i>= 0; i--) ( heapify(hT, i); ) ) ) void deleteNode(vector &hT, int num) ( int size = hT.size(); int i; for (i = 0; i = 0; i--) ( heapify(hT, i); ) ) void printArray(vector &hT) ( for (int i = 0; i < hT.size(); ++i) cout << hT(i) << " "; cout << ""; ) int main() ( vector heapTree; insert(heapTree, 3); insert(heapTree, 4); insert(heapTree, 9); insert(heapTree, 5); insert(heapTree, 2); cout << "Max-Heap array: "; printArray(heapTree); deleteNode(heapTree, 4); cout << "After deleting an element: "; printArray(heapTree); )
Aplicativos de estrutura de dados heap
- Heap é usado ao implementar uma fila de prioridade.
- Algoritmo de Dijkstra
- Classificação de pilha








