Verify Preorder Serialization of a Binary Tree 验证二叉树前序序列化
前序遍历是啥就不说了,百度一下, 简单说就是root-> left_child->right_child.被前序序列化的二叉树就是一个按照前序遍历的顺序,空节点用#
来标识。
该二叉树可以被序列化
"9,3,4,#,#,1,#,#,2,#,6,#,#"
Input: preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"
Output: true
Input: preorder = "1,#"
Output: false
Input: preorder = "9,#,#,1"
Output: false
思路
使用一个很奇特的思路,类似于迭代。正常的前序序列化,每个叶子节点 x,后面肯定是2个#,所以通过拆叶子节点的方式,把每个叶子节点拆掉并用# 替换。这样不停地向root拆。如果最后能拆成一个#,说明这个序列就是前序序列
public boolean isValidSerialization(String preorder) {
String[] sp = preorder.split(",");
Stack<String> s = new Stack<>();
for(int i =0;i<sp.length; i++){
s.push(sp[i]);
int last = s.size()-1;
while(s.size()>=3&& s.get(last).equals("#")&&s.get(last-1).equals("#")&&!s.get(last-2).equals("#")){ s.pop();
s.pop();
s.pop();
s.push("#");
last = s.size()-1;
}
}
return s.size()==1&&s.peek().equals("#");
}
Tag
stack