给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1] 输出: 0
提示:
- 节点数在
[1, 1000]
范围内 -1000 <= Node.val <= 1000
思路:
要求左叶子之和,就要求判断当前节点是否为左叶子,而仅通过自身是无法判断自己是不是左叶子的,还需要借助其父节点,当满足 root.left!=null && root.left.left ==null && root.left.right == null 时说明 root.left 是一个左叶子,将其值加入返回结果中。
简而言之,遍历所有节点,只需要对每一个节点判断其是否有左叶子,若有,加入左叶子的值即可。
代码:
递归版:
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if(root==null)return 0;
int leftValue = sumOfLeftLeaves(root.left);
int rightValue = sumOfLeftLeaves(root.right);
int sum =0;
if(root.left!=null&&root.left.left==null&&root.left.right==null){
sum+=root.left.val;
}
sum = sum + leftValue + rightValue;
return sum;
}
}
迭代版:
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if(root==null)return 0;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
int res=0;
while(!stack.isEmpty()){
TreeNode node = stack.pop();
if(node.left!=null&&node.left.left==null&&node.left.right==null){
res+=node.left.val;
}
if(node.left!=null)stack.push(node.left);
if(node.right!=null)stack.push(node.right);
}
return res;
}
}
参考:代码随想录