给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5.
/ \
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;
}
}