331. Verify Preorder Serialization of a Binary Tree

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:
"9,3,4,#,#,1,#,#,2,#,6,#,#"
Return true

Example 2:
"1,#"
Return false

Example 3:
"9,#,#,1"
Return false

Hide Tags

Intuitive solution with stack:
public class Solution {
  public boolean isValidSerialization(String preorder) {
    String[] nodes = preorder.split(",");
    boolean completeWithNull = false; //Indicate whether the tree has ended with a null
    Deque<String> parents = new ArrayDeque<>();
    for (int i = 0; i < nodes.length; ++i) {
      String c = nodes[i];
      if (completeWithNull) //if the tree completes with null, then we shouldn't see more nodes
        return false;
      if (c.equals("#")) {
        if (parents.isEmpty() && !completeWithNull)
          completeWithNull = true;
        else
          parents.pop();
      } else
        parents.push(c);
    }
    return completeWithNull && parents.isEmpty();
  }
}

 

Simpler solution:
public class Solution {
  public boolean isValidSerialization(String preorder) {
    String[] strs = preorder.split(",");
    int vacant = 1;
    for (String str : strs) {
      if (vacant == 0) //if all have been filled, return false
        return false;
      if (str.equals("#")) //A # fills a vacant spot.
        --vacant;
      else // A number yields a vacant spot.
        ++vacant;
    }
    return vacant == 0; // check if all spots have been filled.
  }
}

 

 
posted @ 2016-07-26 12:47  新一代的天皇巨星  阅读(153)  评论(0编辑  收藏  举报