Verify Preorder Serialization of a Binary Tree

Verify Preorder Serialization of a Binary Tree


One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, we record the node’s value. If it is a null node, we record using a sentinel value such as #.

1
2
3
4
5
6
7
     _9_
/ \
3 2
/ \ / \
4 1 # 6
/ \ / \ / \
# # # # # #

For example, the above binary tree can be serialized to the string “9,3,4,#,#,1,#,#,2,#,6,#,#”, where # represents a null node.

Given a string of comma separated values, verify whether it is a correct preorder traversal serialization of a binary tree. Find an algorithm without reconstructing the tree.

Each comma separated value in the string must be either an integer or a character ‘#’ representing null pointer.

You may assume that the input format is always valid, for example it could never contain two consecutive commas such as “1,,3”.

Example 1:
“9,3,4,#,#,1,#,#,2,#,6,#,#”
Return true

Example 2:
“1,#”
Return false

Example 3:
“9,#,#,1”
Return false

解法是利用栈,逐个消去节点的子树:

1
2
3
4
5
6
7
8
9
10
"9,3,4,#,#,1,#,#,2,#,6,#,#"

9 3 4 # # 9 3 #
true true true false false -> true true false

9 3 # 1 # # 9 3 # # 9 #
true true false true false false -> true true false false -> true false

9 # 2 # 6 # # 9 # 2 # # 9 # # #
true false true false true false false -> true false true false false -> true false false -> false

AC代码,使用了vector作为栈:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class Solution {
public:
bool isValidSerialization(string preorder) {
string s;
vector<bool> sk;
if (preorder[0] == '#' && preorder.length() == 1)
{
return true;
}
if(preorder.length() < 3 || preorder[0] == '#')
{
return false;
}
preorder.push_back(',');
for (int i = 0 ; i < preorder.length(); ++i)
{
if (preorder[i] == ',')
{
if (s.length() && s[0] != '#')
{
sk.push_back(true);
}
s.clear();
if (sk.size() > 2)
{
size_t preLen = 0;
while(preLen != sk.size() && sk.size() >= 2)
{
preLen = sk.size();
if (sk[sk.size()-1] == false && sk[sk.size()-2] == false)
{
sk.pop_back();
if (sk.size() == 0)
{
return false;
}
sk.pop_back();
if (sk.size() == 0)
{
return false;
}
sk.pop_back();
sk.push_back(false);
if (sk[0] == false && i < preorder.length() - 1)
{
return false;
}
}
}
}
}
else if (preorder[i] == '#')
{
sk.push_back(false);
}
else
{
s.push_back(preorder[i]);
}
}
if (sk.size() == 1)
{
return true;
}
return false;
}
};