在本篇博客中,我们将详细解析 LeetCode 404 题 "求二叉树所有左叶子之和",并提供 递归搜索 的解法。同时,我们会优化代码,使其更高效、更易理解。无论你是初学者还是资深开发者,都可以从中受益。
1. 题目描述
示例 1
输入:
root = [3,9,20,null,null,15,7]
示例树结构:
3
/ \
9 20
/ \
15 7
输出:
24
解释: 左叶子节点有两个,分别是 9
和 15
,所以返回 9 + 15 = 24
。
示例 2
输入:
root = [1]
输出:
0
解释: 树中没有左叶子节点,返回 0
。
2. 解题思路
左叶子节点的定义:
-
必须是左子节点(即它是其父节点的左孩子)。
-
必须是叶子节点(即它没有左子树和右子树)。
我们可以使用 递归搜索(DFS 深度优先遍历) 来遍历整棵树,并判断每个节点的左孩子是否为左叶子。
3. 代码实现(递归 DFS)
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;
return dfs(root);
}
private int dfs(TreeNode node) {
if (node == null) return 0;
int sum = 0;
// 检查左子节点是否是左叶子节点
if (node.left != null && node.left.left == null && node.left.right == null) {
sum += node.left.val;
}
// 递归遍历左右子树
sum += dfs(node.left);
sum += dfs(node.right);
return sum;
}
}
4. 代码优化(简化递归逻辑)
我们可以在 dfs
方法中直接进行累加,减少 sum
变量的使用,使代码更简洁:
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
int sum = 0;
if (root.left != null && root.left.left == null && root.left.right == null) {
sum += root.left.val;
}
return sum + sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right);
}
}
优化点:
-
直接使用
sum + sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right)
进行递归计算,无需额外的dfs
方法。 -
代码更简洁,提高可读性。
5. 时间复杂度分析
由于我们需要遍历整棵二叉树,每个节点最多访问一次,因此 时间复杂度为 O(n),其中 n
为二叉树的节点数。
6. 总结
-
理解题意: 重点是判断一个节点是否是左叶子节点。
-
解题思路: 递归 DFS 遍历整棵树,累加所有左叶子的值。
-
代码优化: 通过减少变量使用,使代码更简洁。
-
时间复杂度: O(n),需要遍历整棵二叉树。
希望这篇文章对你有所帮助!如果觉得有用,请点赞、收藏、关注,你的支持是我持续更新的动力!🔥🔥🔥
📌 更多 LeetCode 题解分享,请关注我的 优快云 博客! 🚀