Фон
Немеченое дерево может выглядеть так:
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
задача
Учитывая список целых чисел, решите, является ли это допустимой линеаризацией дерева, используя как можно меньше байтов. Вы можете написать полную программу или функцию.
Входные данные: непустой список неотрицательных целых чисел.
Вывод: истинное значение, если список является линеаризацией дерева, иначе ложное значение.
Testcases
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@{+\(_{\}&}/|!}
Думаю?