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 }
  • 相关阅读:
    vue插件大全
    提高webpack的构建速度的几种方法概括
    当async/await碰见forEach-------------爆炸
    jquery 源码解析 节点遍历
    jquery工具类函数
    jqueryUI 插件
    Jquery常用插件
    jquery 基础-Ajax应用
    JavaScipt 源码解析 Sizzle选择器
    JavaScipt 源码解析 css选择器
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5174349.html
Copyright © 2011-2022 走看看