0%

331.验证二叉树的前序序列化

331.验证二叉树的前序序列化

题目描述:

给出一个二叉树的前序遍历序列,如果是一个空节点使用#替代。验证是否是一个合法的遍历序列。

数据范围:
$1 \le preorder.length \le 10^4$

题解:

首先统一的做法是缩点,先把叶子结点缩点(后面跟着两个#的),用#替换这个叶子结点。一直缩到不能缩为止,如果最后剩余一个空根节点说明合法。

其次可以发现空节点的数量是比节点数量多1,因为每次加一个节点时都是消耗一个空节点,增加两个空节点,净增 $1$ 。因此可以根据空节点的数量判断是否合法。初始空节点数量为 $1$ 。然后每次遇到一个非空节点,先减后加;每次遇到一个空节点减减。如果中途有小于 $0$ 的情况说明不合法。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution
{
public:
const static int maxn = 1e5 + 10;
const static int maxm = 1e5 + 10;
const static int INF = 0x3f3f3f3f;
bool isValidSerialization(string preorder)
{
int cnt = 1, n = preorder.size();
for (int i = 0; i < n; ++i)
{
if (preorder[i] == '#')
{
if(cnt == 0) return false;
--cnt;
++i;
}
else if (isdigit(preorder[i]))
{
if(cnt == 0) return false;
cnt++;
while (i < n && preorder[i] != ',')
++i;
}
}
return cnt == 0;
}
};