Qual é a melhor estrutura de dados que pode ser usada para implementar uma árvore binária em Python?
104
Qual é a melhor estrutura de dados que pode ser usada para implementar uma árvore binária em Python?
Respostas:
Aqui está minha implementação recursiva simples da árvore de pesquisa binária.
fonte
node is not None
vez do seu(node!=None)
. Além disso, você pode usar a__str__
função em vez do método printTree.def _find(self, val, node): if(val == node.v): return node elif(val < node.v and node.l != None): return self._find(val, node.l) elif(val > node.v and node.r != None): return self._find(val, node.r)
left<=root<=right
?Leia mais sobre isso aqui: -Esta é uma implementação muito simples de uma árvore binária.
Este é um bom tutorial com perguntas entre
fonte
insertLeft
está quebrado e produzirá um loop infinito em qualquer tentativa de atravessar recursivamente para baixo no ramo mais à esquerda da árvore binária[O que você precisa para entrevistas] Uma classe Node é a estrutura de dados suficiente para representar uma árvore binária.
(Embora outras respostas estejam corretas, elas não são necessárias para uma árvore binária: não há necessidade de estender a classe de objeto, não há necessidade de ser um BST, não há necessidade de importar deque).
Aqui está um exemplo de árvore:
Neste exemplo, n1 é a raiz da árvore tendo n2, n3 como seus filhos.
fonte
Implementação simples de BST em Python
fonte
Uma maneira muito rápida e suja de implementar uma árvore binária usando listas. Não é o mais eficiente, nem lida muito bem com valores nulos. Mas é muito transparente (pelo menos para mim):
Construindo uma árvore a partir de um iterável:
Atravessando uma árvore:
fonte
Não posso deixar de notar que a maioria das respostas aqui estão implementando uma árvore de busca binária. Árvore de pesquisa binária! = Árvore binária.
Uma árvore de busca binária tem uma propriedade muito específica: para qualquer nó X, a chave de X é maior que a chave de qualquer descendente de seu filho esquerdo e menor que a chave de qualquer descendente de seu filho direito.
Uma árvore binária não impõe tal restrição. Uma árvore binária é simplesmente uma estrutura de dados com um elemento 'chave' e dois filhos, digamos 'esquerda' e 'direita'.
Uma árvore é um caso ainda mais geral de uma árvore binária em que cada nó pode ter um número arbitrário de filhos. Normalmente, cada nó possui um elemento 'filho' que é do tipo lista / matriz.
Agora, para responder à pergunta do OP, estou incluindo uma implementação completa de uma árvore binária em Python. A estrutura de dados subjacente que armazena cada BinaryTreeNode é um dicionário, visto que oferece pesquisas O (1) ideais. Eu também implementei travessias em primeiro lugar e em profundidade. Essas são operações muito comuns realizadas em árvores.
fonte
você não precisa ter duas classes
fonte
Um pouco mais "Pythônico"?
fonte
fonte
Uma
Node
classe baseada em nós conectados é uma abordagem padrão. Isso pode ser difícil de visualizar.Motivado por um ensaio sobre Python Patterns - Implementing Graphs , considere um dicionário simples:
Dado
Uma árvore binária
Código
Faça um dicionário de nós únicos :
Detalhes
find_all_paths()
).As funções baseadas em árvore geralmente incluem as seguintes operações comuns:
Tente implementar todas essas operações. Aqui, demonstramos uma dessas funções - uma passagem BFS:
Exemplo
Este é um algoritmo de pesquisa em amplitude (ordem de nível) aplicado a um dicionário de nós e filhos.
deque
, mas aqueue
ou alist
funciona (o último é ineficiente).Veja também este tutorial detalhado sobre árvores.
Discernimento
Algo ótimo sobre travessias em geral, podemos facilmente alterar a última abordagem iterativa para pesquisa em profundidade (DFS) simplesmente substituindo a fila por uma pilha (também conhecida como Fila LIFO). Isso significa simplesmente que retiramos da fila do mesmo lado que enfileiramos. O DFS nos permite pesquisar cada ramo.
Quão? Como estamos usando um
deque
, podemos emular uma pilha mudandonode = q.popleft()
paranode = q.pop()
(direita). O resultado é um direito favorecida, DFS pré-encomendado :['a', 'c', 'f', 'b', 'e', 'd']
.fonte
fonte
Esta implementação suporta operações de inserção, localização e exclusão sem destruir a estrutura da árvore. Esta não é uma árvore banlançada.
fonte
Eu sei que muitas boas soluções já foram postadas, mas geralmente tenho uma abordagem diferente para árvores binárias: ir com alguma classe de Node e implementá-la diretamente é mais legível, mas quando você tem muitos nós, pode se tornar muito ganancioso em relação à memória, então eu sugerir adicionar uma camada de complexidade e armazenar os nós em uma lista python e, em seguida, simular um comportamento de árvore usando apenas a lista.
Você ainda pode definir uma classe Node para finalmente representar os nós na árvore quando necessário, mas mantê-los em uma forma simples [valor, esquerda, direita] em uma lista usará metade da memória ou menos!
Aqui está um exemplo rápido de uma classe Binary Search Tree armazenando os nós em um array. Ele fornece funções básicas, como adicionar, remover, localizar ...
Eu adicionei um atributo pai para que você possa remover qualquer nó e manter a estrutura BST.
Desculpe pela legibilidade, especialmente pela função "remover". Basicamente, quando um nó é removido, retiramos o array da árvore e o substituímos pelo último elemento (exceto se quisermos remover o último nó). Para manter a estrutura do BST, o nó removido é substituído pelo máximo de seus filhos esquerdos ou min de seus filhos direitos e algumas operações devem ser feitas para manter os índices válidos, mas é rápido o suficiente.
Eu usei esta técnica para coisas mais avançadas para construir alguns dicionários de palavras grandes com um trie interno e fui capaz de dividir o consumo de memória por 7-8 (você pode ver um exemplo aqui: https://gist.github.com/fbparis / b3ddd5673b603b42c880974b23db7cda )
fonte
Uma boa implementação da árvore de pesquisa binária , tirada daqui :
fonte
Quero mostrar uma variação do método de @apadana, que é mais útil quando há um número considerável de nós:
fonte
fonte
Árvore binária em Python
fonte
Aqui está uma solução simples que pode ser usada para construir uma árvore binária usando uma abordagem recursiva para exibir a árvore na ordem em que a travessia foi usada no código abaixo.
Código retirado de: Binary Tree in Python
fonte