BM29 二叉树中和为某一值的路径(一)

描述
给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
在这里插入图片描述

例如:
给出如下的二叉树,\ sum=22 sum=22,

返回true,因为存在一条路径 5\to 4\to 11\to 25→4→11→2的节点值之和为 22

数据范围:
1.树上的节点数满足 0 \le n \le 100000≤n≤10000
2.每 个节点的值都满足 |val| \le 1000∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(树的高度)O(树的高度),时间复杂度 O(n)O(n)

思路:这一题其实考的是深度优先路径,根据题意将深度优先的根节点到叶子节点之间的和与输入的sum做比较,如果相等返回true 否则 false。我们需要获取到每一条路径,在叶子节点处做运算,如果符合条件,将返回true。否则我们需要删除该路径,进入到下一次路径中。如果没有一条符合的返回false。因为这里用了回调无法直接返回,用了一个变量保存;

function hasPathSum( root ,  sum ) {
    // write code here
    if(!root) return false;
    let res = [];
    let leaf = [];
    let temp = false;
    function cd(root, index){
       if(!root) return ;
       root.flg = true;
       res.push(root);
       if(!root.right && !root.left){
          let sum2 = 0
          for(let i = 0; i < res.length; i++){
              sum2 += res[i].val;
          }
          if(sum2 === sum) {
              temp = true;
          } else {
              let idx = 0;
              for(let i = res.length - 1; i >=0 ; i--){
                  let left = res[i].left || '';
                  let right = res[i].right || '';
                  if(left && !left.flg || right && !right.flg){
                     idx = i;
                      break;
                  }
              }
              res = res.slice(0, idx + 1);
          }
       }
       cd(root.right, index+1);
       cd(root.left, index+1);
    }
     cd(root,0);
    return temp;

}

牛客刷题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值