Conceito<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
Em ciência da computação, árvores são estruturas de dados hierárquicas formadas por nós (nodes) conectados, onde cada nó pode ter vários nós filhos, mas apenas um nó pai (exceto a raiz, que não possui pai). A árvore começa por um nó raiz e se ramifica em subárvores, organizando dados de forma que facilite operações como busca, inserção, remoção e ordenação. Elas são amplamente utilizadas em algoritmos, bancos de dados, sistemas de arquivos, linguagens de programação e inteligência artificial. Existem diversos tipos de árvores, como árvores binárias, árvores balanceadas (AVL, Red-Black), árvores B, Trie, entre outras, cada uma adaptada para casos específicos de uso.
</aside>
<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
Árvores são estruturas adequadas para representar hierarquias
<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
Um caminho na árvore T é uma sequência v1, v2, ...., vn de vértices, onde n ≥ 1, tal que Vi é pai de Vi+1.
Um caminho composto de uma sequência v1, v2, ...., vnde vértices
tem comprimento n-1.
Sempre existe um único caminho entre um vértice e qualquer um de seus descendentes.
<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
Grau ou grau de saída de um nó: número de filhos do nó.
Nível de um nó: é a distância do nó até a raiz.
Altura ou profundidade de um nó v: é o número de nós do maior caminho de v até um descendente próprio.
Observações<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
Dependendo do número máximo de filhos que cada nó da árvore pode ter, a árvore pode ter um nome específico:
De um modo geral, chamamos de árvore n-ária (n ≥ 2) aquela em que cada nó pode ter de 0 a n filhos.
</aside>
<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
Uma árvore é completa quando os nós com alguma subárvore vazia estão no último ou penúltimo nível da árvore
<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
Uma árvore é cheia quando todos os seus nós internos tem o número máximo de filhos e todas as folhas estão no mesmo nível.
Árvores Binárias<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
A representação de árvores binárias é simples, pois cada nó pode ter, no máximo, dois filhos (duas subárvores).
Linguagem C
</aside><aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
É possível percorrer todos os nós de uma árvore binária usando três estratégias:
Observação: o termo "visita a raiz" significa que o valor contido naquele nó será processado. Ele pode, por exemplo, ser simplesmente impresso.
</aside>
Binárias de Busca (ABB)<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
Todos os elementos da subárvore à esquerda são menores que o nó raiz e todos os elementos da subárvore à direita são maiores que o nó raiz.
No exemplo da ABB a cima, todos os elementos na subárvore à esquerda de 8 são menores que ele e todos os elementos na subárvore à direita de 8 são maiores que ele.
</aside>
Busca<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
A busca de um elemento em uma ABB segue essa lógica:
<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
Outra propriedade interessante da ABB é o cálculo do menor e do maior elemento:
Menor elemento: a partir da raiz, caminhar sempre para o nó mais à esquerda. O último nó à esquerda é o que contém o menor elemento
Maior elemento: a partir da raiz, caminhar sempre para o nó mais à direita. O último nó à direita é o que contém o maior elemento.
Inserção<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
A inserção de um novo elemento em uma ABB segue a mesma lógica da busca:
Exclusão<aside> <img src="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" alt="notion://custom_emoji/6a9f75af-b090-4ac1-9370-a797e429cd85/12c39bc1-c32f-80fa-b777-007a474b0a18" width="40px" />
A exclusão em Árvores Binárias de Busca não são tão triviais quanto a inserção ou busca, pois é preciso preservar suas propriedades.
Para removermos um nó X de uma Árvore Binária de Busca preservando suas propriedades, precisamos considerar três casos:
</aside>