解题思路
我们可以定义一个概念,叫做槽位。一个槽位可以被看作「当前二叉树中正在等待被节点填充」的那些位置。
在这里插入图片描述
我们使用栈来维护槽位的变化。栈中的每个元素,代表了对应节点处剩余槽位的数量,而栈顶元素就对应着下一步可用的槽位数量。当遇到空节点时,仅将栈顶元素减 1;当遇到非空节点时,将栈顶元素减 11 后,再向栈中压入一个 2。无论何时,如果栈顶元素变为 0,就立刻将栈顶弹出。
代码
class Solution {
public boolean isValidSerialization(String preorder) {
int n = preorder.length(),right = 0;
char[] chars = preorder.toCharArray();
if (n==0) return false;
LinkedList<Integer> stack = new LinkedList<>();
stack.add(1);
while (right<n){
System.out.println(chars[right]);
if (stack.isEmpty()) return false;
if (Character.isDigit(chars[right])) {
int num = stack.getLast();
stack.removeLast();
num--;
if (num!=0){
stack.add(num);
}
stack.add(2);
right=right+2;
}
else if (chars[right]==',') right++;
else if (chars[right]=='#'){
int num = stack.getLast();
stack.removeLast();
num--;
if (num!=0){
stack.add(num);
}
right++;
}
System.out.println(stack);
}
// System.out.println(stack);
return stack.isEmpty();
}
}