Hintergrund
Ein unbeschrifteter Baum kann folgendermaßen aussehen:
o
/ | \
o o o
| / \
o o o
Um diesen Baum zu linearisieren, kennzeichnen wir zuerst jeden Knoten o
mit der Anzahl der untergeordneten Knoten:
3
/ | \
1 0 2
| / \
0 0 0
und schreiben Sie dann die Zahlen in einer Liste auf eine atemlose Weise, dh Zeile für Zeile und von links nach rechts:
[3, 1, 0, 2, 0, 0, 0]
Dies ist eine einzigartige und eindeutige Darstellung des obigen Baums, was bedeutet, dass keine zwei verschiedenen reinen Bäume die gleichen Linearisierungen haben und dass wir den ursprünglichen Baum aus der Liste rekonstruieren können.
Obwohl jeder Baum einer bestimmten Ganzzahlliste entspricht, stellt nicht jede Ganzzahlliste einen gültigen linearisierten Baum dar: Zum Beispiel [2, 0, 0, 0]
stellt er keinen gültigen Baum dar. Wenn wir versuchen, ihn zu delinearisieren, erhalten wir diesen Baum
[2,0,0,0] -> 2 [0,0,0] -> 2 [0,0] -> 2 [0]
/ \ / \ / \
0 0 0
aber noch eine 0
links in der Liste und nirgends zu setzen. Ebenso [2, 0]
ist auch keine gültige Baumlinearisierung, da der de-linearisierte Baum einen leeren untergeordneten Punkt hat:
2
/ \
0
Aufgabe
Entscheiden Sie anhand einer Ganzzahlliste, ob es sich um eine gültige Linearisierung eines Baums handelt, indem Sie so wenig Bytes wie möglich verwenden. Sie können ein vollständiges Programm oder eine Funktion schreiben.
Eingabe: Eine nicht leere Liste nicht negativer Ganzzahlen.
Ausgabe: Ein wahrer Wert, wenn die Liste eine Linearisierung eines Baums ist, andernfalls ein falscher Wert.
Testfälle
Wahrheit[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]
Falsch
[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@{+\(_{\}&}/|!}
Meiner Ansicht nach?