【leetcode】112. 路径总和

44 阅读1分钟

leetcode-112.png

这道题比较典型,是一个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
};