zoukankan      html  css  js  c++  java
  • Leetcode: Verify Preorder Serialization of a Binary Tree

    One way to serialize a binary tree is to use pre-oder 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:
    "9,3,4,#,#,1,#,#,2,#,6,#,#"
    Return true
    
    Example 2:
    "1,#"
    Return false
    
    Example 3:
    "9,#,#,1"
    Return false

    跟G面经:Valid Preorder traversal serialized string一样

    用stack, 注意插入“#”是while

     1 public class Solution {
     2     public boolean isValidSerialization(String preorder) {
     3         if (preorder==null || preorder.length()==0) return false;
     4         String[] strs = preorder.split(",");
     5         int depth = 0;
     6         for (int i=0; i<strs.length; i++) {
     7             String cur = strs[i];
     8             while (cur.equals("#") && st.size()>1 && st.peek().equals("#")) {
     9                 st.pop();
    10                 st.pop();
    11             }
    12             st.push(cur);
    13         }
    14         if (st.size()==1 && st.peek().equals("#")) return true;
    15         return false;
    16     }
    17 }

    有人提供了O(1) space不用stack用两个pointer的做法,还不理解

     1 public class Solution {
     2     public boolean isValidSerialization(String preorder) {
     3         if (preorder == null || preorder.length() == 0) return false;
     4         String[] strs = preorder.split(",");
     5         int depth = 0;
     6         int i = 0; 
     7         while (i < strs.length - 1) {
     8             if (strs[i++].equals("#")) {
     9                 if (depth == 0) return false;
    10                 else depth--;
    11             }
    12             else depth++;
    13         }
    14         if (depth != 0) return false;
    15         return strs[strs.length - 1].equals("#");
    16     }
    17 }
  • 相关阅读:
    [BZOJ1659][Usaco2006 Mar]Lights Out 关灯
    [BZOJ1789][BZOJ1830][Ahoi2008]Necklace Y型项链
    [HDU5015]233 Matrix
    [BZOJ1786][BZOJ1831]逆序对
    各种音视频编解码学习详解
    Methods and systems for sharing common job information
    在nodejs使用Redis缓存和查询数据及Session持久化(Express)
    jQuery 遍历 – 同胞(siblings)
    jQuery 遍历 – 后代
    jQuery 遍历 – 祖先
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5174349.html
Copyright © 2011-2022 走看看