验证二叉树的前序序列化
序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #
解题代码
思路:我们可以将一个合法的序列进行逐层缩减。例:
- "9,3,4,#,#,1,#,#,2,#,6,#,#" 4 ## 是一个合法前序遍历结果,那么直接进行缩减为 #,依次进行即可
- "9,3,4,#,#,1,#,#,2,#,6,#,#"
- "9,3,#,1,#,#,2,#,6,#,#"
- "9,3,#,#,2,#,6,#,#"
- "9,#,2,#,6,#,#"
- "9,#,2,#,#"
- "9,#,#"
- 如此便缩减完所有序列,判断最后是否只有一个根节点即可
var isValidSerialization = function(preorder) {
let stack = []; // 存储删减后的节点
let orderS = preorder.split(",");
for (let i = 0; i < orderS.length; i++) {
const order = orderS[i];
stack.push(order); // 依次入栈
// console.log("stack",stack);
while (stack.length >= 3 && (stack[stack.length - 1] === "#" && stack[stack.length - 2] === "#")) {
// 缩减点,将 n## 组合的值改为 #
stack[stack.length - 3] = "#";
stack.pop();
stack.pop();
}
// console.log("stack POP",stack);
const last = stack.length - 1;
if (stack.length === 2 && stack[last]=== "#" && stack[last - 1] === "#") return false; // 判断边界条件,如果缩减后栈中为 # #, 那么下一位入栈元素可能也是 #, # # # 是非法序列
}
return stack.length === 1 && stack[0] === "#";
};