题意:
给定一个叶子节点只能是#,且#只能是叶子节点的二叉树的前序遍历序列,判断是否符合上述规则。
分析:
因为不能重构这棵树,判断是否合乎规则,这是栈的重要应用。
比如:
6
# 3
# #
对于6来说3下面怎样不重要,3的下面必然是两个#,这很好办,但也可能像6一样,下面只有一个#
我们只需将3及其子树变为#放回栈中,作为6的叶子结点即可:
6
# #
处理即可
我们分析发现,只要连续两个#就把他俩连带前一个数字消掉,用#代替即可。
这个思路本来不敢完全确定,用例子在纸上走一遍之后发现可行,实现之后发现代码居然和讨论区一个仁兄一模一样哈哈。
public class Solution {
public boolean isValidSerialization(String preorder) {
Stack<String> s = new Stack<String>();
String[] cs = preorder.split(",");
for(int i=0; i<cs.length; i++){
String c = cs[i];
while(!s.isEmpty() && s.peek().equals("#") && c.equals("#")){
s.pop();
if(s.isEmpty())
return false;
s.pop();
}
s.push(c);
}
return s.size()==1 && s.peek().equals("#");
}
}