目录
一、题目描述
给定二叉树的根节点
root
,返回所有左叶子之和。示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24示例 2:
输入: root = [1] 输出: 0提示:
- 节点数在
[1, 1000]
范围内-1000 <= Node.val <= 1000
二、题目分析
常规深搜广搜水题~这种题目最快的做法是靠几个定义~
【1】叶子节点
在代码中,我们用以下代码判断叶子节点
root.left==null && root.right==null
可以看到,可以通过本身的节点,判断自己是否是叶子节点。
【2】左叶子节点
因为只要左叶子,所有判断条件要前置,即
root.left!=null && root.left.left==null && root.left.right==null
只要定义这里没问题,那就可以秒了。
【1】root==null? 是则返回0
【2】递归计算左边
【3】递归计算右边
【4】对于当前节点,如果有左叶子节点,则加上
【6】返回结果
PS:如果觉得用这种方式,难以理解,可以参考第二份代码,然后再回过头来看这个方式。
三、Java代码
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
int left = sumOfLeftLeaves(root.left);
int right = sumOfLeftLeaves(root.right);
if (root.left != null && root.left.left == null && root.left.right == null) {
left += root.left.val;
}
return left + right;
}
}
附带一份已于理解的代码~
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
return dps(root,false);
}
public int dps(TreeNode root,boolean isLeft){
if(root.left==null && root.right==null){ //是否叶子节点
if(isLeft)return root.val; //左叶子
return 0; //右叶子
}else if(root.left==null){ //没有左边,搜索右边
return dps(root.right,false);
}else if(root.right==null){ //没有右边,搜索左边
return dps(root.left,true);
}else { //两边都有,两边同时搜索
return dps(root.right,false)+dps(root.left,true);
}
}
}