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

50 25 75 10 33 90 raiz folhas

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:

  1. Observe o valor do nó atual.
  2. Se ele for o valor procurado, a busca termina.
  3. Se o valor procurado for menor, vá para o filho esquerdo.
  4. Se for maior, vá para o filho direito.

Exemplo:

50 25 75 10 alvo 33 90 1 2 3 1. 50 > 10 → esquerda 2. 25 > 10 → esquerda 3. encontrado!

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

  1. Encontrar o sucessor do nó.
  2. Substituir o valor do nó removido por esse sucessor.
  3. 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)