这道题比较典型,是一个DFS的解法。深度优先搜索,来遍历所有可能性。
递归
var hasPathSum = function (root, targetSum) {
// dfs
if (!root) return false
if (!root.left && !root.right) {
return root.val === targetSum
}
let left = hasPathSum(root.left, targetSum - root.val)
let right = hasPathSum(root.right, targetSum - root.val)
return left || right
};
递归子树的时候,要减去当前节点的val,然后进入到下一节点。
跳出循环到条件就是,左右子树都为空,此时就是叶子结点,那么就需要判断此时的 targetSum是不是和叶子结点相等。相等的话,那就是可以得到0,反之不能。
非递归
这里要用 stack 来模拟 DFS
错误的写法
这里最主要的错误是return的条件判断,这里判断是叶子结点,就直接return了,导致遇到第一个叶子结点的时候,就直接return,后续的情况不会判断了。
var hasPathSum = function (root, targetSum) {
if (!root) return false
let stack = [[root, targetSum]]
while (stack.length) {
let [node, sum] = stack.pop()
if (!node.left && !node.right) { // 错误
return node.val === sum
}
if (node.left) stack.push([node.left, sum - node.left.val])
if (node.right) stack.push([node.right, sum - node.right.val])
}
return false
};
正确代码
在这里直接判断剩余的值是不是0,就不需要在return里面判断了,可以遍历到true的情况
var hasPathSum = function (root, targetSum) {
if (!root) return false
let stack = [[root, targetSum - root.val]]
while (stack.length) {
let [node, sum] = stack.pop()
if (!node.left && !node.right && sum === 0) {
return true
}
if (node.right) stack.push([node.right, sum - node.right.val])
if (node.left) stack.push([node.left, sum - node.left.val])
}
return false
};