背景
未标记的树可能如下所示:
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
任务
给定一个整数列表,请确定它是否是使用尽可能少的字节进行的树的有效线性化。您可以编写完整的程序或函数。
输入: 非负整数的非空列表。
输出: 如果列表是树的线性化,则为真实值,否则为伪造值。
测试用例
特鲁西[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@{+\(_{\}&}/|!}
我认为?