验证给定的字符串是否为先序遍历的序列

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

相关文章
相关标签/搜索