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
思路:
通过一个栈实现
1、如果是数字,直接push入栈
2、如果是“#”,判断栈顶是否是“#”,如果是,弹出两个元素,并且将栈前面的所有“#”全部弹出;如果不是,直接入栈
程序如下所示:
class Solution {
ArrayDeque<String> stack = new ArrayDeque<>();
public boolean isValidSerialization(String preorder) {
String[] str = preorder.split(",");
for (int i = 0; i < str.length; ++ i){
while (str[i].equals("#")&&!stack.isEmpty()&&stack.peek().equals("#")){
stack.pop();
if (stack.isEmpty()){
return false;
}
stack.pop();
}
stack.push(str[i]);
}
return stack.size() == 1&&stack.peek().equals("#");
}
}