题目
https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree/
栈
如果为数字则消耗一个插槽增加两个插槽,如果为空节点则消耗一个插槽,判断最后栈是否为空,为空则为有效序列。
class Solution {
public boolean isValidSerialization(String preorder) {
int len = preorder.length();
LinkedList<Integer> stack = new LinkedList<>();
stack.push(1);
int i = 0;
while (i < len) {
char c = preorder.charAt(i);
if (stack.isEmpty()) return false;
if (c == '#') {
int top = stack.pop() - 1;
if (top > 0) {
stack.push(top);
}
} else if (Character.isDigit(c)) {
while (i < len && Character.isDigit(preorder.charAt(i))) {
i++;
}
int top = stack.pop() - 1;
if (top > 0) {
stack.push(top);
}
stack.push(2);
}
i++;
}
return stack.isEmpty();
}
}
计数
把栈中的插槽看成一个整体,遇到空节点消耗一个插槽,遇到数字消耗一个插槽增加两个插槽,也就是增加一个插槽,如果最后插槽数量为空则为有效序列。
class Solution {
public boolean isValidSerialization(String preorder) {
int len = preorder.length();
int slots = 1;
for (int i = 0; i < len; i++) {
if (slots == 0) return false;
char c = preorder.charAt(i);
if (c == '#') {
slots--;
} else if (Character.isDigit(c)) {
while (i < len && Character.isDigit(preorder.charAt(i))) {
i++;
}
slots++;
}
}
return slots == 0;
}
}