LeetCode 404 | 求二叉树所有左叶子之和(详细解析+代码优化)

在本篇博客中,我们将详细解析 LeetCode 404 题 "求二叉树所有左叶子之和",并提供 递归搜索 的解法。同时,我们会优化代码,使其更高效、更易理解。无论你是初学者还是资深开发者,都可以从中受益。

1. 题目描述

示例 1

输入:

root = [3,9,20,null,null,15,7]

示例树结构:

    3
   / \
  9  20
    /  \
   15   7

输出:

24

解释: 左叶子节点有两个,分别是 915,所以返回 9 + 15 = 24


示例 2

输入:

root = [1]

输出:

0

解释: 树中没有左叶子节点,返回 0


2. 解题思路

左叶子节点的定义:

  1. 必须是左子节点(即它是其父节点的左孩子)。

  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 题解分享,请关注我的 优快云 博客! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值