左叶子之和
LeetCode 404
https://leetcode-cn.com/problems/sum-of-left-leaves/
法一、深度优先搜索
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) {
return 0;
}
return dfs(root);
}
public int dfs(TreeNode root) {
int ans = 0;
if (root.left != null) { // 左孩子存在且是 叶子结点,则累加,否则继续向下搜索
ans += isLeafNode(root.left) ? root.left.val : dfs(root.left);
}
// 处理右孩子,右孩子存在且不是叶子结点,则可以从右孩子为根节点 开始搜索
if (root.right != null && !isLeafNode(root.right)) {
ans += dfs(root.right);
}
return ans;
}
// 判断该节点是不是叶子结点
public boolean isLeafNode(TreeNode node) {
return node.left == null && node.right == null;
}
}
法二、递归
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) {
return 0;
}
int ans = 0;
// 左孩子存在,且左孩子是叶子结点
if (root.left != null && root.left.left == null && root.left.right == null) {
ans += root.left.val;
}
// 分别以左孩子和右孩子为根节点 向下搜索,并加上当前节点累加得到的结果
return sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right) + ans;
}
}
法三、广度优先搜索
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) {
return 0;
}
int ans = 0;
Deque<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node.left != null) {
// 左孩子是叶子结点,则累加,不是叶子结点则入队
if (isLeafNode(node.left)) {
ans += node.left.val;
} else {
queue.offer(node.left);
}
}
if (node.right != null) {
// 右孩子不是叶子结点就可以入队
if (!isLeafNode(node.right)) {
queue.offer(node.right);
}
}
}
return ans;
}
public boolean isLeafNode(TreeNode node) {
return node.left == null && node.right == null;
}
}
网友评论