331. Verify Preorder Serialization of a Binary Tree

    /*
     * 331. Verify Preorder Serialization of a Binary Tree
     * 2016-7-9 by Mingyang
     * 这个题目我的绝对原创的思路是把number##变为#,这样不断地俄罗斯方块式的减少
     * 到最后只剩下一个#,所以自己就这么做,然后用StringBuffer的replace功能
     * 但是发现有一个case过不去,就是"9,#,92,#,#"为什么呢?就是因为我只把单个digit
     * 的数考虑进去,没有看92作为一个整体。
     * 然后参考网上的stack的做法,一样的思路
     * 另外还有非常巧妙的大神,用出度跟入度一样来做,真的是非常棒!
     */
    //自己最初的做法
    public static boolean isValidSerialization(String preorder) {
        int len = preorder.length();
        if (preorder == null || len == 0)
            return true;
        preorder = preorder.replaceAll(",", "");
        StringBuffer sb = new StringBuffer(preorder);
        int i = sb.length();
        while (i >= 3) {
            while (i > 2) {
                if (sb.charAt(i - 1) == ‘#‘ && sb.charAt(i - 2) == ‘#‘ && sb.charAt(i - 3) != ‘#‘) {
                    sb.replace(i - 3, i, "#");
                    i = sb.length();
                } else {
                    i--;
                }
            }
            break;
        }
        if (sb.toString().equals("#"))
            return true;
        return false;
    }
     //Stack的做法:
    public boolean isValidSerialization1(String preorder) {
        // using a stack, scan left to right
        // case 1: we see a number, just push it to the stack
        // case 2: we see #, check if the top of stack is also #
        // if so, pop #, pop the number in a while loop, until top of stack is
        // not #
        // if not, push it to stack
        // in the end, check if stack size is 1, and stack top is #
        if (preorder == null) {
            return false;
        }
        Stack<String> st = new Stack<>();
        String[] strs = preorder.split(",");
        for (int pos = 0; pos < strs.length; pos++) {
            String curr = strs[pos];
            while (curr.equals("#") && !st.isEmpty() && st.peek().equals(curr)) {
                st.pop();
                if (st.isEmpty()) {
                    return false;
                }
                st.pop();
            }
            st.push(curr);
        }
        return st.size() == 1 && st.peek().equals("#");
    }
    //出度,入度的做法:
    public boolean isValidSerialization2(String preorder) {
        String[] strs = preorder.split(",");
        int degree = -1; // root has no indegree, for compensate init with -1
        for (String str : strs) {
            degree++; // all nodes have 1 indegree (root compensated)
            if (degree > 0) { // total degree should never exceeds 0
                return false;
            }
            if (!str.equals("#")) {// only non-leaf node has 2 outdegree
                degree -= 2;
            }
        }
        return degree == 0;
    }
时间: 2024-08-05 21:44:08

331. Verify Preorder Serialization of a Binary Tree的相关文章

leetcode 331. Verify Preorder Serialization of a Binary Tree

传送门 331. Verify Preorder Serialization of a Binary Tree My Submissions QuestionEditorial Solution Total Accepted: 10790 Total Submissions: 34071 Difficulty: Medium One way to serialize a binary tree is to use pre-order traversal. When we encounter a

LeetCode OJ 331. Verify Preorder Serialization of a Binary Tree

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 #. _9_ / 3 2 / \ / 4 1 # 6 / \ / \ / # # # # # # For examp

[LeetCode] 331. 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 #. _9_ / 3 2 / \ / 4 1 # 6 / \ / \ / # # # # # # For e

331. Verify Preorder Serialization of a Binary Tree -- 判断是否为合法的先序序列

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 #. _9_ / 3 2 / \ / 4 1 # 6 / \ / \ / # # # # # # For examp

[leetcode] 331. Verify Preorder Serialization of a Binary Tree 解题报告

题目链接: https://leetcode.com/problems/verify-preorder-serialization-of-a-binary-tree/ 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

[栈] leetcode 331 Verify Preorder Serialization of a Binary Tree

problem:https://leetcode.com/problems/verify-preorder-serialization-of-a-binary-tree/ 这道题需要记录一个count值,表示当前树还有多少个地方可以插入新的节点(包括插入数字和插入Null). 如果插入的是数字节点,那么会多一个可用的位置(新的节点占用了一个,但又新增了两个):如果插入的是null,那么它只会占用一个,所以会少一个可用的位置. 每次遇到没有可用位置的时候,意味着当前字符串非法. 扫描到最后时,如果

[LeetCode][JavaScript]Verify Preorder Serialization of a Binary Tree

Verify Preorder Serialization of a Binary Tree 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 #. _9_ / 3

【LeetCode】Verify Preorder Serialization of a Binary Tree(331)

1. Description 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 #. _9_ / 3 2 / \ / 4 1 # 6 / \ / \ / # # #

Verify Preorder Serialization of a Binary Tree

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 #. _9_ / 3 2 / \ / 4 1 # 6 / \ / \ / # # # # # # For examp