tło
Nieoznakowane drzewo może wyglądać następująco:
o
/ | \
o o o
| / \
o o o
Aby linearyzować to drzewo, najpierw oznaczamy każdy węzeł o
jego liczbą węzłów potomnych:
3
/ | \
1 0 2
| / \
0 0 0
a następnie zapisz liczby na liście w pierwszej kolejności, oznaczając wiersz po wierszu i od lewej do prawej:
[3, 1, 0, 2, 0, 0, 0]
Jest to unikalna i jednoznaczna reprezentacja drzewa powyżej, co oznacza, że żadne dwa różne czyste drzewa nie będą miały takich samych linearyzacji i że możemy odtworzyć oryginalne drzewo z listy.
Chociaż każde drzewo odpowiada pewnej liście liczb całkowitych, nie każda lista liczb całkowitych reprezentuje prawidłowe drzewo zlinearyzowane: Na przykład [2, 0, 0, 0]
nie reprezentuje prawidłowego drzewa, jeśli spróbujemy go zlinearyzować, otrzymamy to drzewo
[2,0,0,0] -> 2 [0,0,0] -> 2 [0,0] -> 2 [0]
/ \ / \ / \
0 0 0
ale nadal mam 0
na liście miejsce i nie ma gdzie go umieścić. Podobnie, [2, 0]
nie jest to również prawidłowa linearyzacja drzewa, ponieważ zdlinizowane drzewo ma puste miejsce potomne:
2
/ \
0
Zadanie
Biorąc pod uwagę listę liczb całkowitych, zdecyduj, czy jest to poprawna linearyzacja drzewa, używając jak najmniej bajtów. Możesz napisać pełny program lub funkcję.
Dane wejściowe: niepusta lista liczb całkowitych nieujemnych.
Wynik : prawdziwa wartość, jeśli lista jest linearyzacją drzewa, w przeciwnym razie wartość fałszowania.
Przypadki testowe
Prawda[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@{+\(_{\}&}/|!}
Myślę?