[路飞]_夜验二叉树的前序序列化

739 阅读1分钟

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战331. 验证二叉树的前序序列化

题目

不重要,请看思路

思路:枚举所有字符,将字符压入栈中,遇到栈中有两个连续#,弹出两个#和栈中最后一位数;知道结束;栈中只有一个字符,且字符为#即为正确二叉树前序序列化

幻灯片1.gif

幻灯片2.gif

幻灯片3.gif

幻灯片4.gif

幻灯片5.gif

幻灯片6.gif

幻灯片7.gif

看图是不是很清晰,根据上图编辑代码如下:

var isValidSerialization = function (preorder) {
  const array = preorder.split(',')
  const len = array.length;
  const stack = []
  for (let i = 0; i < len; i++) {
    stack.push(array[i])
    while(stack.length >=3  && stack[stack.length-1] === stack[stack.length-2] && stack[stack.length-1] === '#' && stack[stack.length-3] !== '#'){
      stack.pop();
      stack.pop();
      stack.pop();
      stack.push('#')
    }
  }
  return stack.length === 1 && stack.pop() === '#'
}

出度入度法

观察下图的入度出度;

入度:指向节点的数量
出度:节点指向的数量 image.png

观察上图可以得到
1、无论什么节点,入度都是1; 2、非#节点出度都是2,#节点出度为0; 3、完整二叉树 出度数量 === 入度数量

根据上面观察到的数据和结论编辑代码如下

var isValidSerialization = function (preorder) {
  const array = preorder.split(',')
  const len = array.length
  let diff = 1
  for (let i = 0; i < len; i++) {
    diff -= 1
    if (diff < 0) return false
    if (array[i] !== '#') {
      diff += 2
    }
  }
  return diff === 0
}