问题:java
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 #
.node
_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.spa
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.code
Each comma separated value in the string must be either an integer or a character '#'
representing null
pointer.orm
You may assume that the input format is always valid, for example it could never contain two consecutive commas such as "1,,3"
.leetcode
Example 1:
"9,3,4,#,#,1,#,#,2,#,6,#,#"
Return true
get
Example 2:
"1,#"
Return false
input
Example 3:
"9,#,#,1"
Return false
string
解决:it
① 使用栈,一直删除叶子结点,直到删除完成。若是一个序列像“4##”,则将其更改成“#”并继续。 咱们使用一个堆栈,以便咱们能够记录先前删除的节点。
class Solution { //25ms
public boolean isValidSerialization(String preorder) {
Stack<String> stack = new Stack<>();
String[] ptr = preorder.split(",");
for (int i = 0;i < ptr.length;i ++){
stack.push(ptr[i]);
while(stack.size() >= 3 && stack.get(stack.size() - 1).equals("#")
&& stack.get(stack.size() - 2).equals("#")
&& ! stack.get(stack.size() - 3).equals("#")){
stack.pop();
stack.pop();
stack.pop();
stack.push("#");
}
}
if (stack.size() == 1 && stack.get(0).equals("#")){
return true;
}else {
return false;
}
}
}
②
非叶子结点,入度是1,出度是2;
叶子节点,入度是1,出度是0;
因此计算diff表示总的(入度-出度),初始化1;
主要过程当中,出现diff<0表示出错,结束后diff==0才能够;
class Solution {//9ms public boolean isValidSerialization(String preorder) { String[] ptr = preorder.split(","); int degree = -1;//根节点没有入度,初始化为-1 for (String p : ptr){ degree ++;//除根节点外,其他节点入度均为1 if (degree > 0){//总的度不能大于0 return false; } if(! p.equals("#")){//非叶节点的出度为2 degree -= 2; } } return degree == 0; } }