112. 路径总和(树递归中的一点小收获_什么是子节点)

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。

示例: 
给定如下二叉树,以及目标和 sum = 225.
             /  \
            4.   8
           /    / \
          11.   13  4
         /  \        \
        7    2.       1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2

从这道题中,我学到了关于“root” 与 “root.left”的判断!尤其是判断终结条件和返回值的时候。比如,上一题的输入是一个root,最后返回的值也是root(因为最后结果得是一个树),所以,在递归的时候如果输入的是“root.left”,那么此时返回的也是“root.left”的节点,然后对此进行操作:增删改查、保存,都可以!

而这个题呢?和上不同,返回的不是节点,而是boolean。如何根据“root”来判断当前节点是不是最后返回true的那个节点。假设2是这个节点,成立的条件是:这个root节点的左右孩子为null,并且sum的值为0。
即判断结束条件的时候,这里暂时理解为:判断root的子孩子是不是为null好了。肯定也有判断root为结束条件的,等以后对比一下。

其实归根到底吧,是如何判断一个节点是不是子节点没有搞清,显然应该是当前这个节点没有左右孩子。
当root为null的时候,这时候我们就假设就是真正的树的根,作为一个null数,是没有任何值的,所以返回false。
现在,可是知道了,关于root、root.left、root.right是不是为null是一定要考虑的。

class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if(root == null)
            return false;
        if(root.left == null && root.right == null && sum == root.val)
            return true;

        boolean hasleft =  hasPathSum(root.left,sum-root.val);
        boolean hasright = hasPathSum(root.right,sum-root.val); 

        return hasleft || hasright;
    }
}

注意:判断条件是:sum == root.val

再次我要保存之前的错误版本,以供我之后借鉴:

class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if(sum == 0)
            return true;
        if(root == null && sum != 0))
            return false;
        boolean hasleft = false;
        boolean hasright = false;
        if(root.left != null)
            hasleft =  hasPathSum(root.left,sum-root.val);
        if(root.right != null)
            hasright = hasPathSum(root.right,sum-root.val);    
        return hasleft || hasright;
    }
}

猜你喜欢

转载自blog.csdn.net/xuchonghao/article/details/80598655