zoukankan      html  css  js  c++  java
  • 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判断是不是#然后结束。

  • 相关阅读:
    最大回文子串
    找出不含重复字符的最长子串的长度
    链表表示的2个数相加
    如何胜任一个小型公司的技术总监?我的感想
    React 的坑
    MobX 学习
    摘要
    AI 帮助涂鸦
    计算机的前世今生
    常用编辑器实用技巧(pycharm、sublimeText、vim、vscode、Jupyter)
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/11824055.html
Copyright © 2011-2022 走看看