Árvore Binária
Uma árvore binária é uma estrutura hierárquica em que cada nó possui no máximo dois filhos: um filho esquerdo e um filho direito. Uma Binary Search Tree (BST) é um tipo especial de árvore binária que mantém os valores ordenados. Ela oferece um equilíbrio importante: mantém os dados ordenados enquanto permite operações eficientes de busca, inserção e remoção.
Conceito
O que são Árvores Binárias?
Uma árvore binária é uma estrutura de dados baseada em nós, semelhante às listas ligadas no sentido de que os elementos não são armazenados em posições contíguas de memória, mas conectados por referências.
Cada nó da árvore pode se conectar a outros dois nós, formando uma estrutura hierárquica.
Essa organização permite representar dados de forma eficiente quando precisamos manter ordem e realizar operações frequentes de busca, inserção e remoção.
Árvores binárias surgem como uma solução interessante para um problema comum:
- arrays ordenados permitem busca rápida, mas inserções e deleções são custosas
- hash tables possuem operações muito rápidas, mas não mantêm ordem
As árvores binárias oferecem um equilíbrio: mantêm os dados ordenados e ainda permitem operações eficientes.
Estrutura
Estrutura da Árvore
Uma árvore binária é composta por nós conectados entre si.
Cada nó possui três componentes principais:
- valor → dado armazenado no nó
- left child → referência para o nó à esquerda
- right child → referência para o nó à direita
Alguns termos importantes:
| Termo | Significado |
|---|---|
| Root (raiz) | primeiro nó da árvore |
| Parent (pai) | nó que possui filhos |
| Child (filho) | nó conectado a outro nó acima |
| Leaf (folha) | nó que não possui filhos |
Exemplo:
Nesse exemplo:
- 50 é a raiz
- 25 e 75 são filhos de 50
- 10, 33 e 90 são folhas
Ordenação
Regra de Ordenação
Em uma Binary Search Tree (BST) existe uma regra fundamental:
valores menores ficam à esquerda
valores maiores ficam à direita Essa regra é o que permite que operações de busca sejam realizadas de forma eficiente.
Busca
Busca
A busca em uma árvore binária começa sempre pela raiz.
O algoritmo segue os seguintes passos:
- Observe o valor do nó atual.
- Se ele for o valor procurado, a busca termina.
- Se o valor procurado for menor, vá para o filho esquerdo.
- Se for maior, vá para o filho direito.
Exemplo:
A cada passo descartamos metade das possibilidades.
Complexidade média: O(log N)
Isso é semelhante à eficiência da busca binária em arrays ordenados.
Inserção
Inserção
Inserir um elemento em uma árvore binária segue a mesma lógica da busca.
Primeiro encontramos o local correto onde o novo valor deve ficar.
Exemplo: inserir 30
Como a inserção é fundamentalmente uma busca seguida de um único ajuste, a complexidade é:
Complexidade: O(log N)
Isso é significativamente melhor do que arrays ordenados, onde inserções custam O(N) devido ao deslocamento de elementos.
Remoção
Deleção
Remover um nó de uma árvore binária pode ocorrer em três cenários.
Caso 1 — Nó sem filhos
Se o nó não possui filhos, basta removê-lo.
Caso 2 — Nó com um filho
Se o nó possui apenas um filho, removemos o nó e conectamos o filho diretamente ao seu pai.
Caso 3 — Nó com dois filhos
Esse é o caso mais complexo.
O procedimento é:
- Encontrar o sucessor do nó.
- Substituir o valor do nó removido por esse sucessor.
- Remover o sucessor da posição original.
O sucessor é o menor valor da subárvore direita.
Balanceamento
Árvores Balanceadas vs Não Balanceadas
A eficiência das árvores binárias depende da sua forma.
Árvore Balanceada (Melhor Caso)
Uma árvore balanceada distribui os nós de maneira uniforme.
Altura da árvore ≈ log N
Operações:
- busca → O(log N)
- inserção → O(log N)
- deleção → O(log N)
Árvore Não Balanceada (Pior Caso)
Se os valores forem inseridos em ordem crescente, a árvore pode degenerar em uma lista.
Nesse cenário:
- busca → O(N)
- inserção → O(N)
- deleção → O(N)
Ou seja, a árvore perde sua eficiência.
Traversal
Percorrendo uma Árvore
O processo de visitar todos os nós de uma estrutura de dados é chamado de traversal.
Existem diferentes maneiras de percorrer uma árvore:
- Preorder — raiz, esquerda, direita
- Inorder — esquerda, raiz, direita
- Postorder — esquerda, direita, raiz
Esses percursos são usados em diversos algoritmos e aplicações.
Variações
Outras Estruturas Baseadas em Árvores
Árvores binárias são apenas uma das muitas estruturas baseadas nesse conceito.
Outras variações incluem:
- Heaps
- B-Trees
- Red-Black Trees
- 2-3-4 Trees
Cada uma é otimizada para cenários específicos, especialmente quando lidamos com grandes volumes de dados ou sistemas complexos.
Resumo
Resumo de Complexidades
| Operação | Complexidade (balanceada) |
|---|---|
| Busca | O(log N) |
| Inserção | O(log N) |
| Deleção | O(log N) |