Antecedentes
Un árbol sin etiquetar puede verse así:
o
/ | \
o o o
| / \
o o o
Para linealizar este árbol, primero etiquetamos cada nodo o
con su número de nodos secundarios:
3
/ | \
1 0 2
| / \
0 0 0
y luego escribe los números en una lista de una manera impresionante, es decir, línea por línea y de izquierda a derecha:
[3, 1, 0, 2, 0, 0, 0]
Esta es una representación única e inequívoca del árbol de arriba, lo que significa que no hay dos árboles puros diferentes tendrán las mismas linealizaciones y que podemos reconstruir el árbol original de la lista.
Aunque cada árbol corresponde a una determinada lista de enteros, no cada lista de enteros representa un árbol linealizado válido: por ejemplo [2, 0, 0, 0]
, no representa un árbol válido, si intentamos deslinealizarlo terminamos con este árbol
[2,0,0,0] -> 2 [0,0,0] -> 2 [0,0] -> 2 [0]
/ \ / \ / \
0 0 0
pero todavía tengo una 0
izquierda en la lista y ningún lugar para ponerla. Del mismo modo, [2, 0]
tampoco es una linealización de árbol válida, ya que el árbol des-linealizado tiene un punto hijo vacío:
2
/ \
0
Tarea
Dada una lista entera, decida si es una linealización válida de un árbol utilizando la menor cantidad de bytes posible. Puede escribir un programa completo o una función.
Entrada: una lista no vacía de enteros no negativos.
Salida: un valor verdadero si la lista es una linealización de un árbol, un valor falso de lo contrario.
Casos de prueba
Verdad[0]
[2, 0, 0]
[1, 1, 1, 1, 1, 0]
[3, 1, 0, 2, 0, 0, 0]
[2, 0, 2, 2, 0, 0, 2, 0, 0]
[3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0]
[1, 5, 3, 0, 2, 1, 4, 0, 1, 0, 0, 2, 1, 0, 0, 1, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0]
Falsa
[0, 1]
[2, 0]
[2, 0, 0, 0]
[1, 0, 1]
[3, 2, 1, 0]
[2, 0, 0, 2, 0, 0]
[4, 1, 0, 3, 0, 0, 0, 0]
[4, 2, 0, 3, 1, 0, 0, 0, 0, 0]
{X0@{+\(_{\}&}/|!}
¿Yo creo que?