¿Cuál es la mejor estructura de datos que se puede utilizar para implementar un árbol binario en Python?
104
¿Cuál es la mejor estructura de datos que se puede utilizar para implementar un árbol binario en Python?
Respuestas:
Aquí está mi implementación recursiva simple del árbol de búsqueda binaria.
fuente
node is not None
lugar de tu(node!=None)
. Además, puede utilizar la__str__
función en lugar del 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
?Lea más sobre esto aquí: -Esta es una implementación muy simple de un árbol binario.
Este es un buen tutorial con preguntas intermedias.
fuente
insertLeft
está roto y producirá un bucle infinito en cualquier intento de atravesar recursivamente la rama más a la izquierda del árbol binario[Lo que necesita para las entrevistas] Una clase de nodo es la estructura de datos suficiente para representar un árbol binario.
(Si bien otras respuestas son en su mayoría correctas, no son necesarias para un árbol binario: no es necesario extender la clase de objeto, no es necesario ser un BST, no es necesario importar deque).
A continuación se muestra un ejemplo de un árbol:
En este ejemplo, n1 es la raíz del árbol que tiene n2, n3 como hijos.
fuente
Implementación simple de BST en Python
fuente
Una forma muy rápida y sucia de implementar un árbol binario usando listas. No es el más eficiente ni maneja valores nulos demasiado bien. Pero es muy transparente (al menos para mí):
Construyendo un árbol a partir de un iterable:
Atravesando un árbol:
fuente
No puedo evitar notar que la mayoría de las respuestas aquí implementan un árbol de búsqueda binaria. Árbol de búsqueda binaria! = Árbol binario.
Un árbol de búsqueda binaria tiene una propiedad muy específica: para cualquier nodo X, la clave de X es más grande que la clave de cualquier descendiente de su hijo izquierdo y más pequeña que la clave de cualquier descendiente de su hijo derecho.
Un árbol binario no impone tal restricción. Un árbol binario es simplemente una estructura de datos con un elemento 'clave' y dos hijos, digamos 'izquierda' y 'derecha'.
Un árbol es un caso aún más general de un árbol binario donde cada nodo puede tener un número arbitrario de hijos. Normalmente, cada nodo tiene un elemento "secundario" que es de tipo lista / matriz.
Ahora, para responder a la pregunta del OP, incluyo una implementación completa de un árbol binario en Python. La estructura de datos subyacente que almacena cada BinaryTreeNode es un diccionario, dado que ofrece búsquedas óptimas de O (1). También he implementado recorridos en profundidad y en amplitud. Estas son operaciones muy comunes que se realizan en árboles.
fuente
no necesitas tener dos clases
fuente
¿Un poco más "Pythonic"?
fuente
fuente
Una
Node
clase basada en nodos conectados es un enfoque estándar. Estos pueden ser difíciles de visualizar.Motivado a partir de un ensayo sobre patrones de Python: implementación de gráficos , considere un diccionario simple:
Dado
Un árbol binario
Código
Haz un diccionario de nodos únicos :
Detalles
find_all_paths()
).Las funciones basadas en árboles a menudo incluyen las siguientes operaciones comunes:
Intente implementar todas estas operaciones. Aquí demostramos una de estas funciones: un recorrido BFS:
Ejemplo
Este es un algoritmo de búsqueda en amplitud (orden de nivel) aplicado a un diccionario de nodos y elementos secundarios.
deque
, pero aqueue
o alist
funciona (este último es ineficiente).Consulte también este tutorial detallado sobre árboles.
Visión
Algo grandioso acerca de los recorridos en general, podemos alterar fácilmente el último enfoque iterativo de búsqueda en profundidad (DFS) simplemente reemplazando la cola con una pila (también conocida como Cola LIFO). Esto simplemente significa que sacamos de la cola del mismo lado que ponemos en cola. DFS nos permite buscar en cada rama.
¿Cómo? Como estamos usando a
deque
, podemos emular una pila cambiandonode = q.popleft()
anode = q.pop()
(derecha). El resultado es una derecha favorecida, DFS pre-ordenada :['a', 'c', 'f', 'b', 'e', 'd']
.fuente
fuente
Esta implementación admite operaciones de inserción, búsqueda y eliminación sin destruir la estructura del árbol. Este no es un árbol equilibrado.
fuente
Sé que ya se han publicado muchas soluciones buenas, pero generalmente tengo un enfoque diferente para los árboles binarios: ir con alguna clase de nodo e implementarlo directamente es más legible, pero cuando tienes muchos nodos puede volverse muy codicioso con respecto a la memoria, así que sugiera agregar una capa de complejidad y almacenar los nodos en una lista de Python, y luego simular el comportamiento de un árbol usando solo la lista.
Aún puede definir una clase Node para finalmente representar los nodos en el árbol cuando sea necesario, pero mantenerlos en una forma simple [valor, izquierda, derecha] en una lista usará la mitad de la memoria o menos.
Este es un ejemplo rápido de una clase de árbol de búsqueda binaria que almacena los nodos en una matriz. Proporciona funciones básicas como agregar, eliminar, buscar ...
Agregué un atributo principal para que pueda eliminar cualquier nodo y mantener la estructura BST.
Lo siento por la legibilidad, especialmente por la función "eliminar". Básicamente, cuando se elimina un nodo, sacamos la matriz de árbol y la reemplazamos con el último elemento (excepto si quisiéramos eliminar el último nodo). Para mantener la estructura BST, el nodo eliminado se reemplaza con el máximo de sus hijos izquierdos o el mínimo de sus hijos derechos y se deben realizar algunas operaciones para mantener los índices válidos pero es lo suficientemente rápido.
Usé esta técnica para cosas más avanzadas para construir algunos diccionarios de palabras grandes con un trie de base interno y pude dividir el consumo de memoria entre 7-8 (puede ver un ejemplo aquí: https://gist.github.com/fbparis / b3ddd5673b603b42c880974b23db7cda )
fuente
Una buena implementación del árbol de búsqueda binaria , tomada de aquí :
fuente
Quiero mostrar una variación del método de @ apadana, que es más útil cuando hay una cantidad considerable de nodos:
fuente
fuente
Árbol binario en Python
fuente
Aquí hay una solución simple que se puede usar para construir un árbol binario usando un enfoque recursivo para mostrar el árbol en el orden en que se ha usado el recorrido en el siguiente código.
Código tomado de: Árbol binario en Python
fuente