¿Cómo puedo imprimir un árbol binario en Java para que la salida sea así:
4
/ \
2 5
Mi nodo:
public class Node<A extends Comparable> {
Node<A> left, right;
A data;
public Node(A data){
this.data = data;
}
}
java
printing
binary-tree
Tian
fuente
fuente
Respuestas:
He creado una impresora de árbol binario simple. Puede usarlo y modificarlo como desee, pero de todos modos no está optimizado. Creo que muchas cosas se pueden mejorar aquí;)
Salida 1:
Salida 2:
fuente
Imprima un árbol [grande] por líneas.
ejemplo de salida:
código:
PD Esta respuesta no se enfoca exactamente en árboles "binarios", sino que imprime todo tipo de árboles. La solución está inspirada en el comando "árbol" en Linux.
fuente
children.get(children.size() - 1)
si HashMap se usara para niños? Me las arreglé para modificar todas las otras partes excepto esta.HashMap<String, List<String>>
?HashMap<String, Node>
. La cadena es la identificación del nodo.He creado un algoritmo mejorado para esto, que maneja muy bien los nodos con diferentes tamaños. Imprime de arriba hacia abajo usando líneas.
Para usar esto para su árbol, deje que su
Node
clase implementePrintableNode
.Salida de ejemplo:
fuente
???????????
lugar de las líneas entre nodos, pero debería ser solo un problema UTF8 ans stuff. De todos modos, grandes cosas, tengo que decir. La mejor respuesta para mí, ya que es realmente fácil de usar.public static <T> void print(T[] elems)
imprimirá:
para la entrada
8 4 12 2 6 10 14 1 3 5 7 9 11 13 20 15
esta es una variante de la respuesta de @ anurag: me molestaba ver los | s adicionales
fuente
Adaptado de la respuesta de Vasya Novikov para hacerlo más binario , y usar a para eficiencia (concatenar objetos juntos en Java es generalmente ineficiente).
StringBuilder
String
Salida:
fuente
right != null
. Hice la edición y la probé, funciona bien.michal.kreuzman agradable que tendré que decir.
Me sentía flojo para hacer un programa solo y buscando código en la red cuando encontré esto, realmente me ayudó.
Pero me temo ver que funciona solo para un solo dígito, como si fuera a usar más de un dígito, ya que está usando espacios y no pestañas, la estructura se extraviará y el programa perderá su uso.
En cuanto a mis códigos posteriores, necesitaba algunas entradas más grandes (al menos más de 10), esto no funcionó para mí, y después de buscar mucho en la red cuando no encontré nada, hice un programa yo mismo.
Tiene algunos errores ahora, de nuevo en este momento me siento flojo para corregirlos, pero imprime muy bien y los nodos pueden tener un gran valor.
El árbol no va a ser como la pregunta menciona pero tiene 270 grados de rotación :)
Coloque esta función con su propio TreeNode especificado y mantenga el nivel inicialmente 0, ¡y disfrute!
Estas son algunas de las salidas de muestra:
El único problema es con las ramas extendidas; Intentaré resolver el problema lo antes posible, pero hasta entonces puedes usarlo también.
fuente
Su árbol necesitará el doble de distancia para cada capa:
Puede guardar su árbol en una matriz de matrices, una matriz para cada profundidad:
Si su árbol no está lleno, debe incluir valores vacíos en esa matriz:
Luego, puede iterar sobre la matriz para imprimir su árbol, imprimir espacios antes del primer elemento y entre los elementos según la profundidad e imprimir las líneas según si los elementos correspondientes en la matriz para la siguiente capa están llenos o no. Si sus valores pueden tener más de un carácter, necesita encontrar el valor más largo al crear la representación de matriz y multiplicar todos los anchos y el número de líneas en consecuencia.
fuente
La respuesta de VasyaNovikov me pareció muy útil para imprimir un gran árbol general, y la modifiqué para un árbol binario
Código:
Salida de muestra:
fuente
Una solución en lenguaje Scala , análoga a lo que escribí en Java :
Ejemplo de salida:
fuente
Sé que todos ustedes tienen una gran solución; Solo quiero compartir el mío, tal vez esa no sea la mejor manera, ¡pero es perfecta para mí!
De
python
vezpip
en cuando, ¡es realmente bastante simple! ¡AUGE!En Mac o Ubuntu (el mío es mac)
$ pip install drawtree
$python
, ingrese a la consola de Python; puedes hacerlo de otra manerafrom drawtree import draw_level_order
draw_level_order('{2,1,3,0,7,9,1,2,#,1,0,#,#,8,8,#,#,#,#,7}')
¡HECHO!
Seguimiento de la fuente:
Antes de ver esta publicación, busqué en google "texto plano de árbol binario"
Y encontré esto https://www.reddit.com/r/learnpython/comments/3naiq8/draw_binary_tree_in_plain_text/ , dirígeme a este https://github.com/msbanik/drawtree
fuente
java
espera una respuesta de Java :)fuente
Esta es una solución muy simple para imprimir un árbol. No es tan bonito, pero es realmente simple:
Salida de muestra:
fuente
Basado en la respuesta de VasyaNovikov. Mejorado con algo de magia Java: interfaz genérica y funcional.
Ejemplo de llamada inicial:
Producirá algo como
fuente
Escribí una impresora de árbol binario en Java.
El código está en GitHub aquí .
No se ha optimizado para la eficiencia del tiempo de ejecución, pero como estamos hablando de imprimir en ASCII, pensé que no se usaría en árboles muy grandes. Sin embargo, tiene algunas características agradables.
Algunos programas de demostración / prueba están incluidos.
A continuación, se muestra un ejemplo de un árbol binario generado aleatoriamente, tal como lo imprime el programa. Esto ilustra el uso eficiente del espacio, con un gran subárbol derecho que se extiende debajo de un pequeño subárbol izquierdo:
Un ejemplo de impresión de los cinco árboles binarios de nodo (con etiquetas en orden) en la página:
El siguiente es un ejemplo del mismo árbol impreso en 4 formas diferentes, con espaciado horizontal de 1 y de 3, y con ramas diagonales y horizontales.
fuente
@Makyen
en un comentario.Esta es una pregunta interesante, y también escribí un proyecto para ello.
Impresora de árbol binario
Aquí hay unos ejemplos:
Imprime BST al azar.
Imprimir árbol desde la matriz de orden de nivel de estilo leetcode, '#' significa un terminador de ruta donde no existe ningún nodo a continuación.
fuente
Necesitaba imprimir un árbol binario en uno de mis proyectos, para eso he preparado una clase java
TreePrinter
, uno de los resultados de la muestra es:Aquí está el código para la clase
TreePrinter
junto con la claseTextNode
. Para imprimir cualquier árbol, puede crear un árbol equivalente conTextNode
clase.Finalmente, aquí hay una clase de prueba para imprimir una muestra dada:
fuente
Puede usar un applet para visualizar esto muy fácilmente. Necesita imprimir los siguientes elementos.
Imprima los nodos como círculos con un radio visible
Obtenga las coordenadas para cada nodo.
La coordenada x se puede visualizar como el número de nodos visitados antes de que el nodo sea visitado en su recorrido transversal.
La coordenada y se puede visualizar como la profundidad del nodo particular.
Imprime las líneas entre padres e hijos
Esto se puede hacer manteniendo las coordenadas x e y de los nodos y los padres de cada nodo en listas separadas.
Para cada nodo, excepto la raíz, unir cada nodo con su padre tomando las coordenadas xey del niño y el padre.
fuente
https://github.com/murtraja/java-binary-tree-printer
solo funciona para enteros de 1 a 2 dígitos (fui flojo para hacerlo genérico)
fuente
Esta fue la solución más simple para la vista horizontal. Intenté con muchos ejemplos. Funciona bien para mi propósito. Actualizado de la respuesta de @ nitin-k.
Llamada:
Solución:
fuente
node_length * nodes_count + space_length * spaces_count*
.Código en GitHub: YoussefRaafatNasry / bst-ascii-visualización
fuente
visualize
función, es lavisualizer
clase completa que tiene aproximadamente 200 loc, incluido el archivo de encabezado.Para aquellos que buscan la solución Rust:
El resultado es algo como esto:
fuente
Imprimir en la consola:
Código simple:
fuente
Aquí hay una impresora de árbol muy versátil. No es el mejor, pero maneja muchos casos. Siéntase libre de agregar barras inclinadas si puede resolverlo.
Clase NodeInfo
Clase NodePosition
Y, finalmente, interfaz de nodo
fuente
Una solución Scala, adaptada de la respuesta de Vasya Novikov y especializada para árboles binarios:
fuente
Ver también estas respuestas .
En particular, no fue demasiado difícil usar abego TreeLayout para producir los resultados que se muestran a continuación con la configuración predeterminada.
Si prueba esa herramienta, tenga en cuenta esta advertencia: imprime los niños en el orden en que se agregaron. Para un BST donde las cuestiones de izquierda a derecha importan, encontré que esta biblioteca es inapropiada sin modificaciones.
Además, el método para agregar hijos simplemente toma un nodo
parent
ychild
como parámetros. (Por lo tanto, para procesar un grupo de nodos, debe tomar el primero por separado para crear una raíz).Terminé usando esta solución anterior, modificándola para incluir el tipo
<Node>
para tener acceso aNode
los lados izquierdo y derecho (secundarios).fuente
Aquí hay otra forma de visualizar su árbol: guarde los nodos como un archivo xml y luego deje que su navegador le muestre la jerarquía:
Aquí hay un código para probarlo:
Y la salida se ve así:
fuente
fuente
Esta es una de las versiones más simples que podría implementar. Espero que te ayude
fuente