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:
Input:"9,3,4,#,#,1,#,#,2,#,6,#,#"
Output:true
Example 2:
Input:"1,#"
Output:false
Example 3:
Input:"9,#,#,1"
Output:false
题目大意:
判断字符串是否是有效的序列化字符串。
解法:
这道题目又没有做出来,参考了一下网上的解法,每个树的节点都有入度和出度。
- 非根节点且非空的话,那么该节点的入度为1,出度为2。
- 如果是空节点的话,那么节点的入度为1,出度为0。
定义diff = outdegree - indegree,
最后diff=0的话,说明这是一个有效的序列,如果在任何一个节点,出现diff<0的情况,说明该序列并不是一个有效序列。
java:
class Solution { public boolean isValidSerialization(String preorder) { String[] strs=preorder.split(","); int diff=1; for (int i=0;i<strs.length;i++){ if (--diff<0) return false; if (!"#".equals(strs[i])) diff+=2; } return diff==0; } }