#leetcode112.路径总和

刷了十几道题越来越觉得其实递归的代码难度在于你对出口条件的把握,写出优雅的出口条件,代码其实就很凝练很好看,所以,这方面还得多思考和总结

这道题让我们判断路径中root节点到叶子节点的路径中是否存在和等于targetNum的路径,如果是就返回true,如果不是就返回false;

 这道题不能从下往上求和,因为从叶子节点往上走的话需要记录每个可能的不同路径,要有数据存储,空间复杂度高,而且代码逻辑不好梳理,所以可以从上往下走,走一步减去对应的root.val

那么只需要判断如果走到了叶子节点且当前节点的val等于targetNum就说明已经找到结果,可以不用继续往下递归,而是往上回溯了。。。

但是这个递归到最后的边界条件该如何写呢? 大佬写的是if(root == null) return false;

这个其实可以和第二个结束递归的终止条件联合起来看,问题就明晰许多了,if(root.left == null && root.right == null && root.val == targetSum) return true;

因此能进入到第一个条件的时候,一定是因为它不满足root.val == targetSum这个条件的,而此时一旦root == null 则无需继续判断了,因为首先是无法继续往下走了,空节点没有左右子节点了,其次是空节点没有val值,仍然无法触发满足条件,所以直接返回null,这样联合起来限制出的递归条件就非常的完美了!!!

先看代码,再看分析哈!

说了一大堆还是贴一下代码:

public boolean hasPathSum(TreeNode root, int targetSum) {

        if(root == null)
            return false;
        if(root.left == null && root.right == null && root.val == targetSum)
            return true;

        return hasPathSum(root.left,targetSum - root.val) ||
                hasPathSum(root.right, targetSum - root.val);
    }
原文地址:https://www.cnblogs.com/kerwins-AC/p/14454943.html