LeetCode刷题,验证二叉树的前序序列化(331)

455 阅读1分钟

验证二叉树的前序序列化

序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #

解题代码

思路:我们可以将一个合法的序列进行逐层缩减。例:

  1. "9,3,4,#,#,1,#,#,2,#,6,#,#" 4 ## 是一个合法前序遍历结果,那么直接进行缩减为 #,依次进行即可
  2. "9,3,4,#,#,1,#,#,2,#,6,#,#"
  3. "9,3,#,1,#,#,2,#,6,#,#"
  4. "9,3,#,#,2,#,6,#,#"
  5. "9,#,2,#,6,#,#"
  6. "9,#,2,#,#"
  7. "9,#,#"
  8. 如此便缩减完所有序列,判断最后是否只有一个根节点即可
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] === "#";
};