Фон
Немечене дерево може виглядати так:
o
/ | \
o o o
| / \
o o o
Щоб лінеалізувати це дерево, спочатку позначимо кожен вузол o
його кількістю дочірніх вузлів:
3
/ | \
1 0 2
| / \
0 0 0
а потім запишіть номери в список, дихаючи першим способом, означаючи рядок за рядком і зліва направо:
[3, 1, 0, 2, 0, 0, 0]
Це унікальне та однозначне подання дерева вище, що означає, що жодне два різних чистих дерева не матиме однакових лінеаризацій і що ми можемо реконструювати оригінальне дерево зі списку.
Хоча кожне дерево відповідає певному цілому списку, не кожен цілий список представляє дійсне лінеаризоване дерево: Наприклад [2, 0, 0, 0]
, не представляє дійсного дерева, якщо ми намагаємося делінеаризувати його, ми закінчуємо цим деревом
[2,0,0,0] -> 2 [0,0,0] -> 2 [0,0] -> 2 [0]
/ \ / \ / \
0 0 0
але все ж 0
у списку ліворуч і ніде його не помістити. Так само [2, 0]
не є дійсною лінеаризацією дерев, оскільки делінеаризоване дерево має порожнє дочірнє місце:
2
/ \
0
Завдання
Давши цілий список, вирішіть, чи це дійсна лінеаризація дерева, використовуючи якомога менше байтів. Ви можете написати повну програму або функцію.
Введення: Непорожній список невід’ємних цілих чисел.
Вихідні дані: значення "truthy", якщо список є лінеаризацією дерева, фальшиве значення в іншому випадку.
Тестові шафи
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]
Фальсі
[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@{+\(_{\}&}/|!}
Я думаю?