这题没有思路,所以看题解有两种方法,一种递归,一种类似广度优先,中间逻辑判断的依据都是一样的,
方法一
var hasPathSum = function (root, targetSum) {
// 类似广度优先
if (!root) {
return false;
}
const stack = [];
const res = [];
// 为循环开启
stack.push(root);
res.push(root.val)
while (stack.length) {
let top = stack.pop();
let val = res.pop();
// 这个到最后没有字节点的节点
if (!top.left && !top.right) {
// return val === targetSum; // 这样写 不对
if (val === targetSum) return true
}
// 为下一轮循环开启
if (top.left) {
stack.push(top.left);
res.push(val + top.left.val);
}
// 为下一轮循环开启
if (top.right) {
stack.push(top.right);
res.push(val + top.right.val);
}
}
return false;
};
方法二
var hasPathSum = function (root, targetSum) {
// 类似广度优先
if (!root) {
return false;
}
if (!root.left && !root.right) {
return targetSum - root.val === 0;
}
// 处理依据 每逢节点 都减
targetSum -= root.val;
return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum)
/* // 一下代码不对 ,准备替换上一行
if (root.left) {
return hasPathSum(root.left, targetSum)
}
if (root.right) {
return hasPathSum(root.right, targetSum)
} */
};