题目
给定二叉树的根节点 root ,返回所有左叶子之和。
题解
二叉树的题目,如果需要返回某个值,可以分左右子树递归计算,最后sum=left+right
递归三部曲:
- 确定递归函数的参数和返回值
判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int,使用题目中给出的函数就可以了。 - 确定终止条件
如果遍历到空节点,那么左叶子值一定是0 - 确定单层递归的逻辑
当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
代码中left为什么要分两块计算而right不用?
因为如果直接计算sumOfLeftLeaves(root.left)而root.left恰好为左叶子,则在进入root.left那一层时不再满足(root.left!=null&&root.left.left==null && root.left.right ==null)这个条件,所以left计算要分是否是左叶子两种情况计算
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
int sum,right,left;
//边界条件
if(root==null) return 0;
/*
这里left为什么要分两块计算而right不用?
因为如果直接计算sumOfLeftLeaves(root.left)而root.left恰好为左叶子,则在进入root.left那一层时不再满足(root.left!=null&&root.left.left==null&&root.left.right==null)这个条件,所以left计算要分是否是左叶子两种情况计算
*/
//满足条件:为左叶子
if(root.left!=null&&root.left.left==null&&root.left.right==null){
left=root.left.val;
}else{
left=sumOfLeftLeaves(root.left);
}
right=sumOfLeftLeaves(root.right);
//返回值
return left+right;
}
}
错误做法:
使用全局变量计算左叶子之和,遇到左叶子时返回会使得root刚好只有一个左叶子节点时就返回了,不会进入右子树
class Solution {
public int res;
public int sumOfLeftLeaves(TreeNode root) {
dfs(root);
return res;
}
public void dfs(TreeNode root){
//为空
if(root==null) return;
//满足条件:左叶子,结果集+left.val
//这个做法会使得root刚好只有一个左叶子节点时就返回了,不会进入右子树
//为了避免这种情况,需要返回某个值而不是直接返回
if(root.left!=null&&root.left.left==null&&root.left.right==null){
res+= root.left.val;
return;
}
//不为叶子节点
if(root.left!=null||root.right!=null){
dfs(root.left);
dfs(root.right);//注意root的右子树也可能有左叶子
}
}
}