G面经Prepare: Valid Preorder traversal serialized String

1 求问下各位大神,怎么判断一个按照Preorder traversal serialized的binary tree的序列是否正确呢?不能deserialize成树比如
2 A) 9 3 4 # # 1 # # 2 # 6 # #是对的,因为表示
3            9
4          /   
5        3      2
6       /        
7     4    1      6    
8 B ) 9 3 4 # # 1 # #就是错的,因为无法反构造回一棵树

我觉得可以在字符串里找"n##"这种结构(对应tree里两个children都是Null的叶节点),找到之后就把"n##"改写成"#",也就是把找到的那个末端的子树想想成null,最后字符串变成"#"的就是valid,否则就invalid
比如 A) 9 3 "4 # #" "1 # #" 2 # "6 # #" ---> 9 3 # # 2 # # ---> 9 "3 # #" "2 # #" ---> 9 # # ---> "9 # #" ---> "#"
       B) 9 3 "4 # #" "1 # #" ---> 9 3 # # ---> 9 "3 # #" ---> 9 # (没有"n##"结构了,return false)

也可用stack来这样做,当前如果是#,stack peek如果也是#且size>=2,就pop两次,且再check当前这个#

 1 package PreorderValidSerialized;
 2 import java.util.*;
 3 
 4 public class Solution {
 5     public boolean check(String str) {
 6         String[] strs = str.split(" ");
 7         Stack<String> stack = new Stack<String>();
 8         for (int i=0; i<strs.length; i++) {
 9             if (stack.size()>=2 && strs[i].equals("#") && stack.peek().equals("#")) {
10                 stack.pop();
11                 stack.pop();
12                 i--;
13             }
14             else stack.push(strs[i]);
15         }
16         if (stack.size()==1 && stack.peek().equals("#")) return true;
17         else return false;
18     }
19 
20     /**
21      * @param args
22      */
23     public static void main(String[] args) {
24         // TODO Auto-generated method stub
25         Solution sol = new Solution();
26         boolean res = sol.check("9 3 4 # # 1 # # 2 # 6 # # #");
27         if (res) System.out.println("true");
28         else System.out.println("false");
29     }
30 
31 }
原文地址:https://www.cnblogs.com/EdwardLiu/p/5138501.html