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).

<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:

  1. Se o nó tem o valor procurado então retorna o nó.
  2. Se o valor procurado é menor que a raiz então busca na subárvore à esquerda.
  3. Se o valor procurado é maior que a raiz então busca na subárvore à direita. </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" />

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:

  1. Se já existe um nó com o valor a ser inserido então não insere de novo.
  2. Se o valor a ser inserido é menor que a raiz então insere na subárvore à esquerda.
  3. Se o valor a ser inserido é maior que a raiz então insere na subárvore à direita </aside>

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>