Menu
Coddy logo textTech

Árvore binária

Última atualização

Uma árvore binária é uma hierarquia em que cada nó tem no máximo dois filhos, chamados de filho esquerdo e filho direito. O nó do topo é a raiz, os nós sem filhos são folhas, e o número de arestas da raiz até a folha mais profunda é a altura da árvore. Ao contrário de uma árvore binária de busca, uma árvore binária simples não tem regra de ordenação: é apenas o formato. Pressione play acima para ver uma árvore ser preenchida nível por nível e depois percorrida em ordem (esquerda, nó, direita).

As árvores binárias sustentam muitas estruturas: árvores binárias de busca, heaps, árvores de expressão e mais. Os percursos visitam cada nó em uma ordem definida: em ordem, em pré-ordem e em pós-ordem são os três percursos em profundidade, cada um útil para tarefas diferentes.

Terminologia

TermoSignificado
RaizO nó do topo, sem pai
FolhaUm nó sem filhos
AlturaO caminho mais longo da raiz à folha (em arestas)
ProfundidadeDistância de um nó em relação à raiz
CompletaTodos os níveis cheios exceto talvez o último, preenchido da esquerda para a direita

Os três percursos em profundidade

PercursoOrdemUso comum
Em ordemEsquerda, nó, direitaSaída ordenada de um BST
Pré-ordemNó, esquerda, direitaCopiar / serializar uma árvore
Pós-ordemEsquerda, direita, nóExcluir / avaliar uma árvore

Exemplo resolvido

Percurso em ordem da árvore construída a partir de [4, 2, 6, 1, 3, 5] (preenchida nível por nível):

PassoNo nóAção
14Recorre à subárvore esquerda de 4 antes de visitá-lo
22Recorre à subárvore esquerda de 2 antes de visitá-lo
31Folha, sem filho esquerdo: visita 1, saída [1]
42Esquerda concluída: visita 2, saída [1, 2], depois recorre à direita
53Folha: visita 3, saída [1, 2, 3]
64Subárvore esquerda concluída: visita 4, saída [1, 2, 3, 4], depois recorre à direita
75Filho esquerdo de 6, uma folha: visita 5, saída [1, 2, 3, 4, 5]
86Esquerda concluída, sem filho direito: visita 6, saída [1, 2, 3, 4, 5, 6]

Quando usar uma árvore binária

Use quandoEvite quando
Você precisa modelar dados intrinsecamente hierárquicos (sistemas de arquivos, árvores de expressão, DOM)Os dados são planos e uma lista ou um array bastaria: uma árvore só adiciona sobrecarga
Você quer operações ordenadas e consegue mantê-la equilibrada (um BST ou uma árvore auto-balanceada)Você precisa de busca por chave em O(1) médio: uma tabela hash supera qualquer árvore
Você precisa processar dados estruturados em ordem, pré-ordem ou pós-ordemOs nós são inseridos em ordem crescente em um BST não equilibrado: degrada para uma lista O(n)
Consultas por intervalo ou iteração ordenada importam, o que tabelas hash não oferecemA memória é escassa: cada nó carrega dois ponteiros para filhos além dos dados

Código de Binary Tree

Uma implementação limpa e executável de Binary 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 Tree em Python

Python
1from collections import deque2
3
4class Node:5    def __init__(self, value):6        self.value = value7        self.left = None8        self.right = None9
10
11def insert(root, value):12    # Level-order insert: fill the first empty child slot found13    if root is None:14        return Node(value)15    queue = deque([root])16    while queue:17        node = queue.popleft()18        if node.left is None:19            node.left = Node(value)20            return root21        queue.append(node.left)22        if node.right is None:23            node.right = Node(value)24            return root25        queue.append(node.right)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.value] + inorder(node.right)32
33
34root = None35for value in [1, 2, 3, 4, 5, 6, 7]:36    root = insert(root, value)37
38print("Root:   ", root.value)39print("Inorder:", inorder(root))
Execute este código no Playground de Python

Perguntas frequentes sobre árvores binárias

Qual é a diferença entre uma árvore binária e uma árvore binária de busca?
Uma árvore binária simplesmente limita cada nó a no máximo dois filhos, sem ordenação. Uma árvore binária de busca adiciona a regra de que tudo na subárvore esquerda é menor e tudo na subárvore direita é maior, o que é o que torna a busca rápida.
O que é um percurso em ordem?
O percurso em ordem visita a subárvore esquerda, depois o nó e depois a subárvore direita, de forma recursiva. Para uma árvore binária de busca isso produz os valores em ordem crescente, por isso é o percurso mais comum para demonstrar.
O que é uma árvore binária completa?
Uma árvore binária completa tem todos os níveis totalmente preenchidos exceto talvez o último, que é preenchido da esquerda para a direita. Esse formato permite armazenar a árvore de forma compacta em um array (sem necessidade de ponteiros para filhos), que é como os heaps binários são implementados.
Quando devo usar uma árvore binária em vez de um array ou uma tabela hash?
Recorra a uma árvore quando seus dados são naturalmente hierárquicos ou quando você precisa de operações ordenadas como consultas por intervalo e iteração ordenada, algo que tabelas hash não oferecem. Se você só precisa de busca rápida por chave sem ordenação, o acesso médio O(1) de uma tabela hash supera uma árvore, e para dados planos um array é mais simples e melhor para a cache.
Qual é a diferença entre a altura e a profundidade de uma árvore binária?
A profundidade é medida da raiz para baixo até um nó específico: o número de arestas no caminho da raiz até esse nó. A altura é medida de um nó para baixo até sua folha mais profunda, então a altura de toda a árvore é a profundidade de seu nó mais profundo. Uma árvore de um único nó tem altura 0, e seu único nó também tem profundidade 0.
Por que uma árvore binária não equilibrada tem um desempenho tão ruim?
Buscar, inserir e excluir em uma árvore binária de busca custam O(h), onde h é a altura. Quando as chaves são inseridas em ordem crescente a árvore vira uma linha reta, então h cresce até n e cada operação degrada para O(n), nada melhor que uma lista ligada. Árvores auto-balanceadas como AVL ou rubro-negra mantêm a altura em O(log n) para evitar isso.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR