Description:
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"
.
Solution:
Use a stack. Every time we get a "a # #", replace it with "#", and continuing this in the stack.
Be careful of the edge case.
import java.util.Stack;
public class Solution {
public boolean isValidSerialization(String preorder) {
String[] list = preorder.split(",");
Stack<String> stack = new Stack<String>();
for (int i = 0; i < list.length; i++) {
if (list[i].equals("#")) {
while (!stack.empty()) {
if (stack.peek().equals("#")) {
stack.pop();
if (stack.isEmpty())
return false;
stack.pop();
} else {
break;
}
}
}
stack.push(list[i]);
}
if (stack.empty() || stack.size() > 1 || !stack.peek().equals("#"))
return false;
return true;
}
}