Inspirado por una pregunta reciente sobre SO ...
Escriba una función para imprimir un árbol binario en el siguiente formato:
3
/ \
1 5
\ / \
2 4 6
- La salida debe consistir en una línea de nodos, seguido de una línea de
/
y\
caracteres que indican relaciones, seguida de una línea de nodos, etc. - Puede suponer que todos los nodos son representables como un solo carácter.
- Los nodos adyacentes en el nivel más bajo deben estar separados por al menos un espacio, los nodos más arriba deben estar separados según corresponda.
- Los nodos con dos hijos deben colocarse precisamente en el medio de sus hijos directos.
- Las barras de relación deben estar a medio camino entre el padre y el niño apropiado (redondee de la forma que desee).
Entrada:
La entrada se proporcionará como argumento para su función. No especificaré la estructura exacta del árbol, sin embargo, debe ser utilizable como un árbol binario real. No hay "árboles representados en mi programa como cadenas que coinciden con el resultado esperado".
Puede imprimir en una secuencia de salida o devolver una cadena que contenga la salida, su elección.
Apunta por el código más corto, pero preferiría una solución larga que funcione completamente que una solución corta que funcione al 90%.
Actualización para la recompensa:
Para la recompensa, yo (Optimizer) estoy haciendo pequeños cambios:
- La entrada puede ser de STDIN, ARGV o argumento de función.
- La salida debe estar en STDOUT (o
console.log
para JS) - Puede suponer que la entrada está en forma de matriz, por ejemplo.
[1,2,3]
o[1 2 3]
Actualización 2 : el árbol binario debería ser un árbol de búsqueda binario. Como no mencioné esto inicialmente, permitiré a los usuarios tratar la conversión de una matriz normal en una matriz de árbol de búsqueda binaria como un programa separado y el recuento final de bytes solo será para que el programa tome la matriz como argumento e imprima como un árbol binario
fuente
30000,1000,499999
Respuestas:
Fortran 77 - 1085 caracteres
El árbol se representa en la matriz de entrada
t
de la manera habitual, raíz en 1, raíz-> izquierda en 2, raíz-> derecha en 3 raíz-> izquierda-> izquierda en 4 ...La salida debe caber en un terminal convencional de hasta 5 niveles de profundidad.
Utilizo exactamente una barra entre cada par de nodos, que se ve bastante tonto cerca de la parte superior una vez que hay cuatro o más niveles. Permití nodos de hasta tres dígitos.
Programa completo con comentarios y un andamio de lanzamiento:
Salida con entrada equivalente al ejemplo:
fuente
CJam,
10099 bytesLa entrada debe ser una lista de caracteres, sin caracteres de control ASCII. Los nodos vacíos se denotan por un espacio. También debe ser un árbol binario perfecto con exactamente 2 n -1 nodos.
Ejemplo:
O simplemente use cadenas:
Salida:
Explicación
Script de conversión
Acepta caracteres o números de un solo dígito.
Ejemplos (todos son iguales):
Salida:
Es una construcción sencilla de árbol cartesiano.
fuente
Python 2, 411 bytes
Nota: El primer nivel de sangría es 1 espacio, el segundo es una pestaña.
Llame
f
con una lista de cadenas de un carácter oNone
's, por ejemplo.f(['1',None,'3'])
. La lista no puede estar vacía.Esto debería obedecer las reglas de la recompensa.
Script de conversión:
Convierte y ordena al formato utilizado por la impresora de árbol binario. Ejemplo:
-
Ejemplos:
Para ejecutar estos debe tener el archivo principal llamado
bt.py
y el archivo convertidor llamadoconv.py
.fuente
['1','2','3','4','5','6','7','8','9']
matriz no es lo que mostraste. Debería tener3
como elemento2
secundario correcto el elemento secundario correcto del1
cual es un elemento raíz.APL, 125 caracteres
Ejemplo:
Probado aquí.
fuente
Rubí, 265 bytes.
La versión @proudhaskeller, 269 bytes
Explicación
La versión detallada:
Ejemplo
da:
(Todavía no he escrito el script de conversión).
fuente