Description
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 #.
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
问题描述
序列化二叉树的其中一个方法是前序遍历。当我们遇到一个非空节点,我们记录它的值。当遇到空节点,记录’#’
给定一个逗号分隔的字符串,判断它是否为有效的使用前序遍历序列化二叉树产生的字符串。注意算法不能构建树
字符串中被逗号分隔的要么是’#’,要么是整数
输入总是有效,例如绝对会形如”1, , 3”
问题分析
由于空节点由’#’表示,那么字符串表示的应该为满二叉树,即入度和出度相等。
我们维护dif = 当前遍历节点出度和 - 当前遍历节点入度和
由于根节点只有出度2,因此dif初始化为1。非叶节点可以使dif增1,叶节点使dif减1
遍历字符串,若dif < 0,返回false,遍历结束,判断dif是否等于0
解法
class Solution {
public boolean isValidSerialization(String preorder) {
String[] nodes = preorder.split(",");
int diff = 1;
for (String node: nodes) {
if (--diff < 0) return false;
if (!node.equals("#")) diff += 2;
}
return diff == 0;
}
}