- 题目描述
序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #
例如:二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”,其中 # 代表一个空节点
每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 ‘#’
给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法
- 示例
输入: "9,3,4,#,#,1,#,#,2,#,6,#,#"
输出: true
输入: "1,#"
输出: false
输入: "9,#,#,1"
输出: false
- 分析
方法一:前序遍历
class Solution {
private int pos = 0;
public boolean isValidSerialization(String preorder) {
return dfs(preorder) && pos >= preorder.length();
}
// 前序遍历
public boolean dfs(String preorder) {
if (pos >= preorder.length()) return false; // 递归出口
if ('#' == preorder.charAt(pos)) {
pos += 2; // 逗号占一个位置
return true;
}
while (pos < preorder.length() && Character.isDigit(preorder.charAt(pos))) {
++pos;
}
++pos; // 跳过逗号
return dfs(preorder) && dfs(preorder);
}
}