New Problem Solution "Verify Preorder Serialization of a Binary Tree"

This commit is contained in:
Hao Chen 2017-01-06 09:57:06 +08:00
parent ae37022cea
commit 1ad88addda
2 changed files with 86 additions and 0 deletions
README.md
algorithms/cpp/verifyPreorderSerializationOfABinaryTree

@ -54,6 +54,7 @@ LeetCode
|338|[Counting Bits](https://leetcode.com/problems/counting-bits/) | [C++](./algorithms/cpp/countingBits/CountingBits.cpp)|Medium|
|337|[House Robber III](https://leetcode.com/problems/house-robber-iii/) | [C++](./algorithms/cpp/houseRobber/houseRobberIII.cpp)|Medium|
|334|[Increasing Triplet Subsequence](https://leetcode.com/problems/increasing-triplet-subsequence/) | [C++](./algorithms/cpp/increasingTripletSubsequence/increasingTripletSubsequence.cpp)|Medium|
|331|[Verify Preorder Serialization of a Binary Tree](https://leetcode.com/problems/verify-preorder-serialization-of-a-binary-tree/) | [C++](./algorithms/cpp/verifyPreorderSerializationOfABinaryTree/VerifyPreorderSerializationOfABinaryTree.cpp)|Medium|
|330|[Patching Array](https://leetcode.com/problems/patching-array/) | [C++](./algorithms/cpp/patchingArray/PatchingArray.cpp)|Medium|
|329|[Longest Increasing Path in a Matrix](https://leetcode.com/problems/longest-increasing-path-in-a-matrix/) | [C++](./algorithms/cpp/longestIncreasingPathInAMatrix/LongestIncreasingPathInAMatrix.cpp)|Medium|
|328|[Odd Even Linked List](https://leetcode.com/problems/odd-even-linked-list/) | [C++](./algorithms/cpp/oddEvenLinkedList/OddEvenLinkedList.cpp)|Easy|

@ -0,0 +1,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);
}
}
};