TypeScript 迭代 + 前缀和解决路径总和问题

好像还没人写过ts版本的题解,我就先来抛砖引玉了(笑)。

思路其实很简单,就是在前序遍历的过程中,记录当前结点为止的结点值之和,这样到叶结点的时候就可以很容易地判断路径总和是否等于目标值了。

因为用的是迭代,不像递归那么直接就可以处理前缀和,所以干脆用一个Map来存储了。

function hasPathSum(root: TreeNode | null, sum: number): boolean {
  if (!root) return false;
  const stack = [root];
  const pre_sum = new Map<TreeNode, number>();
  pre_sum.set(root, root.val);
  while (stack.length) {
    const top = stack.pop()!;
    const top_val = pre_sum.get(top)!;
    if (!top.left && !top.right && top_val === sum) return true;
    if (top.left) {
      pre_sum.set(top.left, top_val + top.left.val);
      stack.push(top.left);
    }
    if (top.right) {
      pre_sum.set(top.right, top_val + top.right.val);
      stack.push(top.right);
    }
  }
  return false;
}

可能需要注意的地方:

  1. 适当使用非空断言(或者类型守卫,再或者是一些控制流,这个就看个人喜好了)。因为题目的类型定义,结点的类型是TreeNode | null,如果不加非空断言就会报错TS2531: Object is possibly 'null'
  2. 从Map里取值时有可能出现undefined。这个和第一个的性质其实是一样的,都是确保非空。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值