• 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 }
  • 相关阅读:
    Unity Ply网格读取
    LoadLibrary加载dll失败
    Anaconda引起cuda MSB3721 with return error code 1
    STL 如何对STL进行扩展,简单小结
    集群环境准备(Centos7)
    MySQL中的常见函数
    Mysql优化_第十三篇(HashJoin篇)
    docker创建和使用mysql
    JNI相关笔记 [TOC]
    选择排序
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5174349.html
Copyright © 2020-2023  润新知