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
解决:
① 使用栈,一直删除叶子结点,直到删除完成。如果一个序列像“4##”,则将其更改为“#”并继续。 我们使用一个堆栈,以便我们可以记录先前删除的节点。
class Solution { //25ms
public boolean isValidSerialization(String preorder) {
Stack<String> stack = new Stack<>();
String[] ptr = preorder.split(",");
for (int i = 0;i < ptr.length;i ++){
stack.push(ptr[i]);
while(stack.size() >= 3 && stack.get(stack.size() - 1).equals("#")
&& stack.get(stack.size() - 2).equals("#")
&& ! stack.get(stack.size() - 3).equals("#")){
stack.pop();
stack.pop();
stack.pop();
stack.push("#");
}
}
if (stack.size() == 1 && stack.get(0).equals("#")){
return true;
}else {
return false;
}
}
}
②
非叶子结点,入度是1,出度是2;
叶子节点,入度是1,出度是0;
所以计算diff表示总的(入度-出度),初始化1;
主要过程中,出现diff<0表示出错,结束后diff==0才可以;
class Solution {//9ms
public boolean isValidSerialization(String preorder) {
String[] ptr = preorder.split(",");
int degree = -1;//根节点没有入度,初始化为-1
for (String p : ptr){
degree ++;//除根节点外,其余节点入度均为1
if (degree > 0){//总的度不能大于0
return false;
}
if(! p.equals("#")){//非叶节点的出度为2
degree -= 2;
}
}
return degree == 0;
}
}