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 example, the above binary tree can be serialized to the string "9,3,4,#,#,1,#,#,2,#,6,#,#", where # represents a null node.

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.

Each comma separated value in the string must be either an integer or a character '#' representing null pointer.

You may assume that the input format is always valid, for example it could never contain two consecutive commas such as "1,,3".

Example 1:

Input: "9,3,4,#,#,1,#,#,2,#,6,#,#"
Output: true

Example 2:

Input: "1,#"
Output: false

Example 3:

Input: "9,#,#,1"
Output: false


    public static boolean isValidSerialization(String preorder) {
        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);
            System.out.println(pos + "--->" + st.toString());
        }
        return st.size() == 1 && st.peek().equals("#");
    }

 

 

 

 

 

开始还不太明白,后来画个图就明白了。

遇到数字就push作为root,

遇到第一个#说明是个空,先push,

遇到第二个#说明不会继续往下走了,连续pop这两个#叶子,最后再把根pop出去用#作为新的根,表示这个根已经遍历完了。

等右子树全部遍历完,stack应该只剩下最顶的根和两个#叶子,继续用上面的方法pop掉#和根,再把#push进来,最后stack判断是不是#然后结束。

 

posted @ 2019-11-09 03:27  Schwifty  阅读(107)  评论(0编辑  收藏  举报