Menu
Coddy logo textTech

Árvore binária de busca (BST)

Última atualização

Uma árvore binária de busca mantém seus valores em ordem: para cada nó, todos os valores da subárvore esquerda são menores e todos os da subárvore direita são maiores. Para inserir ou encontrar um valor você começa na raiz e vai repetidamente para a esquerda ou para a direita conforme a comparação, de modo que cada passo divide o espaço de busca pela metade. Pressione reproduzir acima para ver os valores posicionados por comparação e uma busca descendo pela árvore.

Em uma árvore balanceada essas operações rodam em tempo O(log n). O problema: inserir dados já ordenados faz a árvore degenerar em uma lista encadeada com operações O(n), que é exatamente por que existem variantes autobalanceadas como as árvores AVL e rubro-negra.

Complexidade de tempo e espaço

OperaçãoBalanceadaPior caso (desbalanceada)
BuscaO(log n)O(n)
InserçãoO(log n)O(n)
RemoçãoO(log n)O(n)
EspaçoO(n)O(n)

Passo a passo (inserção)

PassoO que acontece
1Se a árvore estiver vazia, o novo valor se torna a raiz.
2Caso contrário, comece na raiz.
3Se o valor for menor, vá para o filho esquerdo; se for maior, vá para a direita.
4Repita até chegar a um espaço vazio.
5Anexe ali o novo valor como uma folha.

Exemplo resolvido

Inserindo [5, 3, 8, 1, 4] em uma árvore vazia, um valor de cada vez:

InserirCaminho percorridoAção
5-A árvore está vazia, então 5 se torna a raiz.
353 < 5, vá para a esquerda; o espaço está vazio, anexe 3 como filho esquerdo de 5.
858 > 5, vá para a direita; o espaço está vazio, anexe 8 como filho direito de 5.
15 -> 31 < 5 vá para a esquerda, depois 1 < 3 vá para a esquerda; anexe 1 como filho esquerdo de 3.
45 -> 34 < 5 vá para a esquerda, depois 4 > 3 vá para a direita; anexe 4 como filho direito de 3.

Quando usar uma árvore binária de busca

Use quandoEvite quando
Você precisa de ordem mais buscas rápidas e as inserções chegam em ordem aleatória.Seus dados chegam já ordenados: uma BST desbalanceada degrada para O(n) por operação.
Você quer que o percurso em ordem retorne os valores em sequência ordenada de graça.Você só precisa de testes de pertencimento sem ordem: uma tabela hash oferece buscas O(1) em média.
Você precisa de consultas por intervalo ou do sucessor/antecessor de uma chave.Você precisa de garantias O(log n): use uma árvore autobalanceada AVL ou rubro-negra.
O conjunto de dados muda com frequência e atualizar um arranjo ordenado seria custoso.O conjunto de dados é fixo e somente leitura: um arranjo ordenado com busca binária é mais simples e melhor para o cache.

Código de Binary Search Tree

Uma implementação limpa e executável de Binary Search Tree em Python, JavaScript, Java, C++, C. Escolha uma linguagem, copie o código ou abra-o já carregado no Playground da Coddy.

Código de Binary Search Tree em Python

Python
1class Node:2    def __init__(self, key):3        self.key = key4        self.left = None5        self.right = None6
7
8def insert(node, key):9    if node is None:10        return Node(key)11    if key < node.key:12        node.left = insert(node.left, key)13    elif key > node.key:14        node.right = insert(node.right, key)15    return node  # duplicates are ignored16
17
18def search(node, key):19    if node is None:20        return False21    if key == node.key:22        return True23    if key < node.key:24        return search(node.left, key)25    return search(node.right, key)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.key] + inorder(node.right)32
33
34root = None35for key in [8, 3, 10, 1, 6, 14, 4, 7]:36    root = insert(root, key)37
38print("Inorder (sorted):", inorder(root))39print("search(6): ", search(root, 6))40print("search(5): ", search(root, 5))
Execute este código no Playground de Python

Perguntas frequentes sobre a árvore binária de busca

Qual é a complexidade de tempo de uma árvore binária de busca?
Busca, inserção e remoção são O(log n) em uma árvore balanceada, porque cada comparação descarta metade dos nós restantes. No pior caso, uma árvore desbalanceada em forma de cadeia por inserções ordenadas, elas degradam para O(n).
Qual é a diferença entre uma árvore binária e uma árvore binária de busca?
Uma árvore binária é qualquer árvore em que cada nó tem no máximo dois filhos, sem regra de ordem. Uma árvore binária de busca acrescenta a invariante de que os valores da subárvore esquerda são menores e os da direita são maiores que o nó, o que possibilita buscas rápidas.
Por que uma árvore binária de busca pode ficar lenta?
Se os valores forem inseridos em ordem crescente (ou decrescente), cada novo nó vai para o mesmo lado, produzindo uma árvore alta e desbalanceada que se comporta como uma lista encadeada: O(n) por operação. Árvores autobalanceadas (AVL, rubro-negra) rotacionam nós para evitar isso.
Qual é a diferença entre uma árvore binária de busca e uma tabela hash?
Uma tabela hash oferece buscas O(1) em média, mas armazena as chaves sem nenhuma ordem, então não pode responder consultas por intervalo ou de sucessor. Uma árvore binária de busca é um pouco mais lenta com O(log n), mas mantém as chaves ordenadas, permitindo percorrê-las em ordem e encontrar valores próximos. Escolha uma BST quando a ordem importa e uma tabela hash quando você só precisa de testes de pertencimento.
Quando devo usar uma árvore autobalanceada em vez de uma BST simples?
Use uma árvore autobalanceada (AVL, rubro-negra) sempre que não puder controlar a ordem de inserção e precisar de desempenho O(log n) garantido. Uma BST simples serve para ensino, para conjuntos pequenos ou quando as chaves chegam em ordem aleatória, mas não protege contra o pior caso desbalanceado.
Um percurso em ordem de uma BST retorna valores ordenados?
Sim. Visitar a subárvore esquerda, depois o nó e então a subárvore direita produz as chaves em ordem crescente, o que decorre diretamente da invariante da BST. Um erro comum é esperar o mesmo de uma árvore binária simples: sem a regra de ordem, o percurso em ordem não produz nenhuma sequência significativa.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR