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 #
.
_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.
Subscribe to see which companies asked this question
思路一:
1.使用“栈”从左到右扫描数据;
2.当遇到数字字符,直接进栈;
3.当遇到“#”字符:
1)如果“栈”顶不是“#”,直接入栈;
2)如果“栈”顶也是“#”,连续再次出栈,循环直到“栈”顶非“#”;
3)“#”字符进栈。
4.最后,当stack中只剩一个“#”字符时,返回true,否则false。
java code:
public class Solution {
public boolean isValidSerialization(String preorder) {
Stack<String> stack = new Stack<>();
String[] str = preorder.split(",");
for(String s : str) {
while(s.equals("#") && !stack.isEmpty() && stack.peek().equals("#")) {
stack.pop();
if(stack.empty()) return false;
stack.pop();
}
stack.push(s);
}
return stack.size() == 1 && stack.peek().equals("#");
}
}
思路二:
计算树的“入度”与“出度”。
设diff = 出度-入度 = outdegree - indegree;
1.当遇到“数字”indegree + 1,outdegree + 2(相当于diff+1),即每个非叶子结点有1个入度和2个出度;
2.当遇到“#”时,indegree + 1(相当于diffe-1);
3.最后,当diff时返回true,否则false。
c++ code:
class Solution {
public:
bool isValidSerialization(string preorder) {
int diff = 1;
for(int i = 0;i < preorder.size(); i++) {
if(preorder[i] == ',') continue;
while('0' <= preorder[i] && preorder[i] <= '9') i++;
if(--diff < 0) return false;
if(preorder[i] != '#') diff += 2;
}
return diff == 0;
}
};