左叶子之和
题目链接:力扣题目链接
难度:简单
给定二叉树的根节点 root ,返回所有左叶子之和。
示例
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
二叉树节点定义
//二叉树节点的定义。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(){}
TreeNode(int val){
this.val = val;
}
TreeNode(int val,TreeNode left,TreeNode right){
this.val = val;
this.left = left;
this.right = right;
}
}
思路
这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。此时就要通过节点的父节点来判断其左孩子是不是左叶子了。
递归代码
class Solution{
public int sumOfLeftLeaves(TreeNode root) {
if(root == null) return 0;
int midVal = 0;
if(root.left != null && root.left.left == null && root.left.right == null) {
midVal = root.left.val;
}
int leftVal = sumOfLeftLeaves(root.left);
int rightVal = sumOfLeftLeaves(root.right);
int sum = midVal + leftVal + rightVal;
return sum;
}
}
迭代代码
class Solution{
public int sumOfLeftLeaves(TreeNode root) {
if(root == null) return 0;
int sum = 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int len = queue.size();
for(int i=0;i<len;i++){
TreeNode node = queue.poll();
if(node.left != null){ // 左节点不为空
queue.offer(node.left);
if(node.left.left == null && node.left.right == null){ // 左叶子节点
sum += node.left.val;
}
}
if(node.right != null){
queue.offer(node.right);
}
}
}
return sum;
}
}