可以直接在力扣上运行成功的代码。
一. 递归实现
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
}
三.总结
总结:递归法的话 要主要在进行左右遍历的时候 会有回溯的过程 回溯的过程其实就是为了返回到二叉树的上一层节点 方便进行右子树的遍历,还有就是对于递归函数的第二个参数,是利用目标值来减去所遍历的每一个节点的值。不用来另外定义一个变量去求和 最后再进行比较 这也是一种解题的思路。
对于层序遍历的话 要注意的是这里要进行求和比较 在定义这个求和接收的参数的时候 要注意用一个数组来接收,方便进行下一层节点的遍历的时候 可以获得一个已经把前面节点已经求和的值。