問題: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; } }