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;
    }
原文地址:https://www.cnblogs.com/zmyvszk/p/5657051.html