您的位置:首页 > 其它

331. Verify Preorder Serialization of a Binary Tree

2016-07-26 12:47 363 查看

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

Stack

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.
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: