驗證給定的字符串是否爲先序遍歷的序列

Verify Preorder Serialization of a Binary Tree

問題: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 trueget

Example 2:
"1,#"
Return falseinput

Example 3:
"9,#,#,1"
Return falsestring

解決:it

① 使用棧,一直刪除葉子結點,直到刪除完成。若是一個序列像「4##」,則將其更改成「#」並繼續。 咱們使用一個堆棧,以便咱們能夠記錄先前刪除的節點。

verify-preorder-serialization-of-a-binary-tree-leetcode-java

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;     } }

相關文章
相關標籤/搜索