fundo
Uma árvore não rotulada pode ser assim:
o
/ | \
o o o
| / \
o o o
Para linearizar essa árvore, primeiro rotulamos cada nó o
com seu número de nós filhos:
3
/ | \
1 0 2
| / \
0 0 0
e, em seguida, escreva os números em uma lista da maneira mais rápida possível, significando linha por linha e da esquerda para a direita:
[3, 1, 0, 2, 0, 0, 0]
Esta é uma representação única e inequívoca da árvore acima, o que significa que não existem duas árvores puras diferentes com as mesmas linearizações e que podemos reconstruir a árvore original a partir da lista.
Embora cada árvore corresponda a uma determinada lista inteira, nem cada lista inteira representa uma árvore linearizada válida: por exemplo [2, 0, 0, 0]
, não representa uma árvore válida, se tentarmos des linearizá-la, terminaremos com essa árvore
[2,0,0,0] -> 2 [0,0,0] -> 2 [0,0] -> 2 [0]
/ \ / \ / \
0 0 0
mas ainda tem uma 0
esquerda na lista e nenhum lugar para colocá-la. Da mesma forma, [2, 0]
também não é uma linearização de árvore válida, pois a árvore não linearizada tem um ponto filho vazio:
2
/ \
0
Tarefa
Dada uma lista inteira, decida se é uma linearização válida de uma árvore usando o mínimo de bytes possível. Você pode escrever um programa completo ou uma função.
Entrada: uma lista não vazia de números inteiros não negativos.
Saída: Um valor verdadeiro se a lista for uma linearização de uma árvore, caso contrário, um valor falso.
Casos de teste
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@{+\(_{\}&}/|!}
Eu acho que?