-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
VerifyPreorderSerializationOfABinaryTree.cpp
85 lines (80 loc) · 2.98 KB
/
VerifyPreorderSerializationOfABinaryTree.cpp
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Source : https://leetcode.com/problems/verify-preorder-serialization-of-a-binary-tree/
// Author : Hao Chen
// Date : 2017-01-06
/***************************************************************************************
*
* 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 #.
*
* _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
*
* Credits:Special thanks to @dietpepsi for adding this problem and creating all test
* cases.
***************************************************************************************/
class Solution {
public:
// we know the following facts:
// 1) if we met a non-null node, then this node will generate two child node.
// 2) if we met a null node, then this node will generate zero child node.
//
// so the idea is,
// 1) we can have a counter to calculate how many node we are going to expect
// 2) once we have the expected node, then we can decrease the counter.
// 3) finally, we will check the counter is zero or not.
//
// the algorithm as below:
// 1) when we meet a non-null node, just simply do `counter++`. because:
// 1.1) we will expect 2 more node after, then we do `counter += 2`.
// 1.2) but the current node also meet the expection of parent node , so, it need remove 1 in counter.
// finally, the `counter = counbter + 2 -1`
// 2) when we meet a null node, just simply do `counter--`.
bool isValidSerialization(string preorder) {
vector<string> list;
split(preorder, ',', list);
//we initailize the counter as 1,
//because we expect at lease 1 node in the tree.
int node_expected = 1;
for (auto node : list) {
if (node_expected == 0) return false;
node == "#" ? node_expected-- : node_expected++;
}
return node_expected == 0;
}
void split(const string &s, char delim, vector<string> &elems) {
stringstream ss(s);
string item;
while (getline(ss, item, delim)) {
elems.push_back(item);
}
}
};