8 min

Trie (Prefix Tree)

Árvore de prefixos para busca eficiente de strings, autocomplete e verificação de prefixos em O(m) onde m é o tamanho da palavra.

DifícilO(m) / O(n * m)ÁrvoreStringsPrefixoAutocompleteDicionário

Visualizador Interativo

Trie (Prefix Tree)Passo 1 / 46
O
Navegando
Fim de palavra
Encontrado
Nao encontrado
Velocidade:800ms
Historico de Passos
#0Inicializando Trie com no raiz vazio

Como Funciona

Trie (pronuncia-se "try") é uma árvore onde cada nó representa um caractere. O caminho da raiz até um nó forma um prefixo. Nós marcados como "fim de palavra" indicam palavras válidas no dicionário. Vantagens sobre hash table: - Busca de prefixos em O(m) - impossível com hash - Autocomplete natural - basta percorrer subárvore do prefixo - Sem colisões - Ordenação lexicográfica grátis (DFS da esquerda para direita) Estrutura do nó: - children: mapa de caractere para nó filho (dict ou array de 26) - is_end: boolean indicando se é fim de palavra válida A complexidade é sempre O(m) onde m é o tamanho da string, independente de quantas palavras existem na trie.

Cada nó compartilha o prefixo de seus ancestrais. Palavras com prefixos comuns compartilham nós, economizando espaço e permitindo buscas por prefixo eficientes.

Passo a Passo

  1. Comece pela raiz (nó vazio)
  2. Para cada caractere da palavra, vá para o filho correspondente
  3. Se o filho não existe e estamos inserindo, crie-o
  4. Ao final da inserção, marque o nó como fim de palavra
  5. Para busca, verifique se chegou ao final E o nó está marcado

Análise de Complexidade

⏱️Tempo
O(m)

m é o tamanho da string. Cada operação percorre no máximo m nós.

Ver prova

Insert, search e startsWith visitam exatamente m nós, um por caractere.

💾Espaco
O(n * m)

No pior caso, n palavras de tamanho m sem prefixos comuns.

🎯Melhor Caso
O(m)

Sempre O(m) independente do número de palavras.

⚠️Pior Caso
O(m)

Mesmo no pior caso, só percorremos m nós.

Comparação com Outros Algoritmos

AlgoritmoTempoEspacoMelhor Para
Trie(atual)O(m) por operaçãoO(n * m)Autocomplete, busca por prefixo, dicionários
Hash TableO(m) médioO(n * m)Busca exata de strings
BST de StringsO(m * log n)O(n * m)Strings ordenadas, range queries

Dicas e Erros Comuns

  • Confundir search (palavra exata) com startsWith (prefixo)
  • Esquecer de marcar is_end na inserção
  • Não tratar caracteres que não existem na busca
  • Usar array fixo de 26 quando precisa de unicode

Perguntas de Entrevista

Pratique respondendo a perguntas comuns de entrevistas tecnicas. Clique em uma pergunta para iniciar uma sessao de pratica com IA.

Implementacao

python
1class TrieNode:Classe TrieNode
2 def __init__(self):Classe TrieNode
3 self.children = {}Classe TrieNode
4 self.is_end = FalseMarcar Fim
5
6
7class Trie:Classe TrieNode
8 def __init__(self):Inicializar Raiz
9 self.root = TrieNode()Inicializar Raiz
10
11 def insert(self, word):Operação Insert
12 node = self.rootTravessia
13 for char in word:Travessia
14 if char not in node.children:Verificar Existência
15 node.children[char] = TrieNode()Criar Nó
16 node = node.children[char]Travessia
17 node.is_end = TrueMarcar Fim
18
19 def search(self, word):Operação Search
20 node = self._find_node(word)Operação Search
21 return node is not None and node.is_endOperação Search
22
23 def startsWith(self, prefix):Operação StartsWith
24 return self._find_node(prefix) is not NoneOperação StartsWith
25
26 def _find_node(self, s):Travessia
27 node = self.rootTravessia
28 for char in s:Travessia
29 if char not in node.children:Verificar Existência
30 return NoneVerificar Existência
31 node = node.children[char]Travessia
32 return nodeTravessia
33
34 def autocomplete(self, prefix):
35 node = self._find_node(prefix)
36 if not node:
37 return []
38 results = []
39 self._dfs(node, prefix, results)
40 return results
41
42 def _dfs(self, node, current, results):
43 if node.is_end:
44 results.append(current)
45 for char, child in node.children.items():
46 self._dfs(child, current + char, results)
47