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
验证一个序列是否能够排成一个二叉树。
算法如下,用到了树的入度和出度的性质,一棵树的入度和出度之和为0.
每个结点的入度都为1,当其!#时,出度为2,否则出度为0。
假设degree初始值为-1,给root节点一个为1的入度。
public class Solution {
public boolean isValidSerialization(String preorder) {
String[] array=preorder.split(",");
int length=array.length;
int degree=-1;
for(int i=0;i<length;i++){
degree++;
if(degree>0) return false;
if(!array[i].equals("#"))degree-=2;
}
return degree==0;
}
}