Dada una lista única y ordenada de enteros, cree un árbol de búsqueda binaria equilibrado representado como una matriz sin utilizar la recursividad.
Por ejemplo:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
Antes de comenzar, una pista: podemos simplificar este problema una tonelada para que no tengamos que pensar en los enteros de entrada (¡ni en ningún objeto comparable para el caso!).
Si sabemos que la lista de entrada ya está ordenada, su contenido es irrelevante. Simplemente podemos pensarlo en términos de índices en la matriz original.
Una representación interna de la matriz de entrada se convierte en:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
Esto significa que, en lugar de escribir algo que tenga que tratar con objetos comparables, realmente solo necesitamos escribir una función que asigne desde el rango [0, n) a la matriz resultante. Una vez que tenemos el nuevo orden, simplemente podemos aplicar la asignación a los valores de la entrada para crear la matriz de retorno.
Las soluciones válidas deben:
- Acepte una matriz de elementos cero y devuelva una matriz vacía.
- Acepte una matriz entera de longitud n y devuelva una matriz entera
- De longitud entre n y la siguiente potencia más alta de 2 menos 1. (por ejemplo, para el tamaño de entrada 13 regrese en cualquier lugar entre 13 y 15).
- Matriz que representa un BST donde el nodo raíz está en la posición 0 y la altura es igual a log (n) donde 0 representa un nodo faltante (o un
null
valor similar si su idioma lo permite). Los nodos vacíos, si están presentes, solo deben existir al final del árbol (por ejemplo,[2,1,0]
)
La matriz de enteros de entrada tiene las siguientes garantías:
- Los valores son enteros con signo de 32 bits mayores que cero.
- Los valores son únicos.
- Los valores están en orden ascendente desde la posición cero.
- Los valores pueden ser escasos (es decir, no adyacentes entre sí).
El código más conciso por recuento de caracteres ascii gana, pero también estoy interesado en ver soluciones elegantes para cualquier idioma en particular.
Casos de prueba
Las salidas para matrices simples que contienen 1
a n
para diversos n
. Como se describió anteriormente, los 0
s finales son opcionales.
[]
[1]
[2,1,0]
[2,1,3]
[3,2,4,1,0,0,0]
[4,2,5,1,3,0,0]
[4,2,6,1,3,5,0]
[4,2,6,1,3,5,7]
[5,3,7,2,4,6,8,1,0,0,0,0,0,0,0]
[6,4,8,2,5,7,9,1,3,0,0,0,0,0,0]
[7,4,9,2,6,8,10,1,3,5,0,0,0,0,0]
[8,4,10,2,6,9,11,1,3,5,7,0,0,0,0]
[8,4,11,2,6,10,12,1,3,5,7,9,0,0,0]
[8,4,12,2,6,10,13,1,3,5,7,9,11,0,0]
[8,4,12,2,6,10,14,1,3,5,7,9,11,13,0]
[8,4,12,2,6,10,14,1,3,5,7,9,11,13,15]