404. 左叶子之和
题目描述
给定二叉树的根节点 root
,返回所有左叶子之和。
示例1:
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1]
输出: 0
方法一:层次遍历
一个节点是 左叶子 节点,当前仅当它是某个节点的叶子阶段,且是一个叶子结点的时候。所以对整棵树进行遍历即可,当我们遍历到节点 node
时,如果它的左子节点是一个叶子结点,那么就将它的左子节点的值累加计入答案。
/**
* Definition for a binary tree node.
* public 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 ans = 0;
Deque<TreeNode> deque = new LinkedList<>();
deque.add(root);
while (!deque.isEmpty()) {
for (int i = deque.size(); i > 0; --i) {
TreeNode node = deque.poll();
if (node.left!=null) {
if (node.left.left==null && node.left.right==null) {
ans += node.left.val;
} else {
deque.offer(node.left);
}
}
if (node.right!=null) {
deque.offer(node.right);
}
}
}
return ans;
}
}
方法二:深度优先
/**
* Definition for a binary tree node.
* public 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) {
/*深度优先*/
return root==null ? 0 : dfsForLeftLeave(root);
}
private int dfsForLeftLeave(TreeNode root) {
int ans = 0;
if (root.left!=null) {
/*判断是不是叶子节点*/
if (root.left.left==null && root.left.right==null) {
ans += root.left.val;
} else {
ans += dfsForLeftLeave(root.left);
}
}
if (root.right!=null) {
ans += dfsForLeftLeave(root.right);
}
return ans;
}
}