题目描述:
解题思路:
递归:
int sum=0;
public int sumOfLeftLeaves(TreeNode root) {
if(root==null)
return sum;
if(root.left!=null&&root.left.left==null&&root.left.right==null)
sum+=root.left.val;
sumOfLeftLeaves(root.left);
sumOfLeftLeaves(root.right);
return sum;
}
public int sumOfLeftLeaves2(TreeNode root) {
if(root==null)
return 0;
if(root.left!=null&&root.left.left==null&&root.left.right==null)
return root.left.val+sumOfLeftLeaves(root.right);
return sumOfLeftLeaves(root.left)+sumOfLeftLeaves(root.right);
}
一开始没写出来,不太明白第二种方法倒数第二行为什么需要+sumOfLeftLeaves(root.right);感觉可以去掉。但是仔细思考一下,如果去掉的话,第一次判断样例的时候,就直接返回9了,后面的return递归根本就不会调用,所以就错了。要加上递归调用右子树的。如果第一种方法没有这种问题,因为在判断完后,数值增加了,接着就return 进入递归了,而不会出现符合一个条件就return 导致无法进入递归的情况。
总之递归,多理解吧。写多就有感觉了,这道题还可以用dfs解决。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
return root != null ? dfs(root) : 0;
}
public int dfs(TreeNode node) {
int ans = 0;
if (node.left != null) {
ans += isLeafNode(node.left) ? node.left.val : dfs(node.left);
}
if (node.right != null && !isLeafNode(node.right)) {
ans += dfs(node.right);
}
return ans;
}
public boolean isLeafNode(TreeNode node) {
return node.left == null && node.right == null;
}
}