一日一练: 验证二叉树的前序序列化

序列化二叉树的一种方法是使用 前序遍历。给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。

在解决字符串的配对问题上有奇效。比如移除无效的括号栈匹配等等。。。如果把节点及左右节点当成一组,也可以用类似的匹配思路去解决。

9,3,4,#,#,1,#,#,2,#,6,#,#为例

  1. 首先考虑字符9,他肯定有左右两个节点,所以先将表示他数量的2入栈

image.png

  1. 下一个字符,,只是连接符,跳过
  2. 下一个字符3,表明节点9的左节点是节点3,将栈顶(节点9对应的子节点数量减 1,同时节点3也有两个节点,将节点3子节点数量2入栈,栈变成

image.png

  1. 下一个字符4,表明节点3的左节点是节点4,将栈顶(节点3对应的子节点数量减 1,同时节点4也有两个节点,将节点4子节点数量2入栈,栈变成

image.png

  1. 下一个字符#,表明节点4的左节点为null,将栈顶(节点4对应的子节点数量减 1

image.png

  1. 下一个字符#,表明节点4的右节点为null

image.png

  1. 此时栈顶数量为0,将0弹出,

image.png

  1. 下一个字符1,表明节点3的右节点是1,将栈顶(节点3对应的子节点数量减 1,此时栈顶数量为0,将0弹出,同时将字符1的左右节点数量2入栈

image.png

  1. 下两个#,将节点1的左右节点数量 减2

  2. 接下来的所有逻辑,在1-9中都能找到相似的逻辑处理。。。。。。

  3. 如果在扫描过程中,栈已空,表明序列化是无效的;如果字符扫描完成,栈为空,表明是有效的前序序列化

具体代码:

function isValidSerialization(preorder: string): boolean {
  // 头节点
  const stack = [1]
  let len = preorder.length
  let i = 0
  while (i < len) {
    if (stack.length === 0) {
      return false
    }
    // 跳过
    if (preorder[i] === ',') {
      i++
    } else if (preorder[i] === '#') {
    // 栈顶数量 -1, 如果为0, 出栈
      if (--stack[stack.length - 1] === 0) {
        stack.pop()
      }
      i++
    } else {
      // 这里是对 多位数 的处理
      while (i < len && preorder[i] !== ',') {
        i++
      }
      if (--stack[stack.length - 1] === 0) {
        stack.pop()
      }
      // 节点有两个子节点
      stack.push(2)
      i++
    }
  }

  return stack.length === 0
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值