sfondo
Un albero senza etichetta può apparire così:
o
/ | \
o o o
| / \
o o o
Per linearizzare questo albero, etichettiamo prima ogni nodo o
con il suo numero di nodi figlio:
3
/ | \
1 0 2
| / \
0 0 0
e quindi scrivere i numeri in un elenco in un modo mozzafiato, intendendo riga per riga e da sinistra a destra:
[3, 1, 0, 2, 0, 0, 0]
Questa è una rappresentazione unica e inequivocabile dell'albero sopra, nel senso che non ci sono due diversi alberi puri con le stesse linearizzazioni e che possiamo ricostruire l'albero originale dall'elenco.
Sebbene ogni albero corrisponda a un determinato elenco di numeri interi, non ogni elenco di numeri interi rappresenta un albero linearizzato valido: ad esempio [2, 0, 0, 0]
non rappresenta un albero valido, se proviamo a de-linearizzarlo finiamo con questo albero
[2,0,0,0] -> 2 [0,0,0] -> 2 [0,0] -> 2 [0]
/ \ / \ / \
0 0 0
ma ho ancora una 0
sinistra nell'elenco e nessun posto dove metterlo. Allo stesso modo [2, 0]
non è neppure una linearizzazione dell'albero valida, poiché l'albero de-linearizzato ha un punto figlio vuoto:
2
/ \
0
Compito
Dato un elenco di numeri interi, decidere se si tratta di una linearizzazione valida di un albero utilizzando il minor numero di byte possibile. È possibile scrivere un programma completo o una funzione.
Input: un elenco non vuoto di numeri interi non negativi.
Output: un valore di verità se l'elenco è una linearizzazione di un albero, altrimenti un valore di falsa.
Casi test
Truthy[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]
Falsy
[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@{+\(_{\}&}/|!}
Credo?