力扣-112-路径求和-javaScript实现

可以直接在力扣上运行成功的代码。

 一. 递归实现

var hasPathSum = function(root, targetSum) {
    // 递归版 定义一个递归函数 
    // 1.确定递归函数的参数和返回值
    let traversal = function(node,count){ // count就是用来用目标和减去当前节点的值所得到的结果
        // 确定终止条件 如果是叶子节点 并且count到最后变成了0 说明满足条件 返回true
        if(node.left === null && node.right === null && count === 0 ) return true;
        // 如果到了叶子结点 并且count不为0 那就返回false
        if(node.left === null && node.right === null && count != 0)return false;
        // 单层递归的逻辑
        if(node.left && traversal(node.left,count - node.left.val))return true; // if的参数里面count - node.left.val 用到了回溯算法 count-=node.left.val traversal(node.left,count);count -= node.right.val

        if(node.right &&  traversal(node.right,count - node.right.val))return true;
        // 如果以上都不满足 则返回false
        return false
    }
    if(!root)return false
    return traversal(root,targetSum - root.val)
};

二. 迭代实现

// 迭代法
let hasPathSum = function(root,targetSum){
    if(root === null )return false
    let queue = []; // 用数组来模拟队列
    let nodeVal = [0]; // 初始化为0
    queue.push(root);
    while(queue.length){ 
        let node = queue.shift();
        let currNode = nodeVal.shift()
        currNode += node.val
        // 判断终止条件
        if(node.left === null && node.right === null && currNode === targetSum)return true;

        // 左节点,将当前的数值也对应记录下来
        if(node.left){
            queue.push(node.left);
            nodeVal.push(currNode);
        }
        // 右节点,将当前的数值也对应记录下来
        if(node.right){
            queue.push(node.right);
            nodeVal.push(currNode);
        }
    }
    return false
}

三.总结 

        总结:递归法的话 要主要在进行左右遍历的时候 会有回溯的过程 回溯的过程其实就是为了返回到二叉树的上一层节点 方便进行右子树的遍历,还有就是对于递归函数的第二个参数,是利用目标值来减去所遍历的每一个节点的值。不用来另外定义一个变量去求和 最后再进行比较 这也是一种解题的思路。

        对于层序遍历的话 要注意的是这里要进行求和比较 在定义这个求和接收的参数的时候 要注意用一个数组来接收,方便进行下一层节点的遍历的时候 可以获得一个已经把前面节点已经求和的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值