当前位置: 首页 > news >正文

LeetCode 404:左叶子之和(Sum of Left Leaves)

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 思路讲解:
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在日常开发中,树形结构是我们经常会碰到的一类数据,比如菜单结构、组织架构、文件系统、或者语法树。而在这些结构中,我们有时需要针对某些特定的节点做聚合计算,比如“求所有左叶子的值之和”。

这道题其实就是一个非常典型的树遍历与判断逻辑结合的题目。看似简单,但它考察了如何准确识别左叶子如何递归遍历树以及如何在遍历中累加计算结果。本文我们就用 Swift 来带你一步步分析并实现这个题目。

描述

题目要求很清晰:
给定一棵二叉树的根节点 root,返回所有左叶子节点的值之和

左叶子指的是“父节点的左子节点”,并且这个左子节点本身没有子节点(也就是它是叶子)。

举个例子

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 左叶子是 9 和 15,它们的和是 24。

题解答案

解决这个问题其实很自然地想到递归。
我们可以从根节点出发,去看它的左右子节点:

  1. 如果左子节点存在,并且它是一个叶子,那么直接加上它的值。
  2. 如果不是叶子,就递归地去继续找。
  3. 右子节点同理,只不过我们不去累加它(因为右叶子不计入结果)。

题解代码分析

下面是完整的 Swift 代码实现,可直接在 Xcode 或 LeetCode Playground 中运行:

import Foundation// 定义树节点结构
public class TreeNode {public var val: Intpublic var left: TreeNode?public var right: TreeNode?public init() { self.val = 0; self.left = nil; self.right = nil }public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil }public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {self.val = valself.left = leftself.right = right}
}class Solution {func sumOfLeftLeaves(_ root: TreeNode?) -> Int {guard let node = root else { return 0 }var sum = 0// 判断当前节点的左子节点是否是叶子if let left = node.left {if left.left == nil && left.right == nil {sum += left.val} else {sum += sumOfLeftLeaves(left)}}// 右子树递归(但不直接加右叶子)if let right = node.right {sum += sumOfLeftLeaves(right)}return sum}
}

思路讲解:

  1. 递归出口:如果当前节点为空,直接返回 0。

  2. 左子树判断

    • 如果当前节点的左子树存在且是叶子(没有左右子节点),累加它的值。
    • 如果不是叶子,就递归地继续往下找左叶子。
  3. 右子树判断

    • 递归计算右子树中的左叶子之和(注意不是右叶子!)。
  4. 返回结果:不断回传计算结果,最终得到整个树的左叶子之和。

示例测试及结果

下面我们构建一个简单的示例二叉树,并测试一下上面的代码是否正确:

// 构造示例树
//     3
//    / \
//   9  20
//     /  \
//    15   7
let root = TreeNode(3)
root.left = TreeNode(9)
root.right = TreeNode(20, TreeNode(15), TreeNode(7))let solution = Solution()
let result = solution.sumOfLeftLeaves(root)
print("左叶子之和为:\(result)")

输出结果:

左叶子之和为:24

一切正常,和题目示例一致

再测试一个边界情况:

let single = TreeNode(1)
print("单节点树左叶子之和:\(solution.sumOfLeftLeaves(single))")

输出:

单节点树左叶子之和:0

因为它没有左叶子,结果自然为 0。

时间复杂度

每个节点只会被访问一次,递归操作也都是常数时间判断。
因此时间复杂度是:

O(n) —— 其中 n 是二叉树的节点总数。

空间复杂度

在递归过程中,系统栈的最大深度取决于树的高度。
最坏情况下(树退化为链表)为 O(n),平均情况约为 O(log n)。

因此:

空间复杂度:O(h),其中 h 是树的高度。

总结

这道题的核心不在于算法复杂度,而在于如何准确识别“左叶子”
我们要注意两个关键点:

  • 必须是左节点(不是右节点)
  • 必须是叶子节点(没有左右子节点)

整体思路非常自然,用递归最简洁,但如果在性能敏感的场景下,也可以用 BFS 或栈模拟递归实现迭代版。

在实际开发中,类似的“聚合型遍历问题”非常常见,比如:

  • 统计树中所有叶子节点的数量
  • 累加某种类型节点的值
  • 查找满足特定条件的节点路径

掌握这类递归模式,几乎可以解决 80% 的树结构算法题。

http://www.dtcms.com/a/511632.html

相关文章:

  • 中小企业网站建设论文高端制作网站技术
  • 电子报 网站开发平面设计培训机构排行
  • 无人系统搭载毫米波雷达的距离测算与策略执行详解
  • Adobe Acrobat软件优化配置,启用字体平滑和默认单页连续滚动
  • 测试题-3
  • win10 win11搜索框空白解决方案
  • Linux系统:多线程编程中的数据不一致问题与线程互斥理论
  • 遇到oom怎么处理?
  • jenkins流水线项目部署
  • 网口学习理解
  • 企业网站 阿里云招聘网站开发
  • 证书兼职的人才网站高明网站设计
  • 用c语言写一个nes游戏模拟器
  • RTCM消息
  • 网络营销从网站建设开始搜索引擎优化的主要特征
  • 2025 年中国医疗行业 OA 办公系统使用情况调研报告
  • 亚信安全连续九年登顶身份和访问管理软件第一,终端安全领跑
  • 中石油工程建设公司网站二手书网站的建设规模
  • 使用 Go + govcl 实现 Windows 资源管理器快捷方式管理器
  • golang/java每日3题
  • 智能数字毫秒表的应用场景介绍,数字毫秒仪 智能毫秒表
  • 【设计模式】工厂模式(Factory)
  • 峰峰专业做网站珠海集团网站建设
  • vue实现打印PDF文档
  • 使用 Python 将 PDF 转成 Excel:高效数据提取的自动化之道
  • 神经网络初次学习收获
  • clickhouse学习笔记(一)基础概念与架构
  • 做网站的业务分析wordpress 国外免费主题
  • [人工智能-大模型-34]:模型层技术 - 通俗易懂的语言阐述Transformer架构
  • 推广你公司网站wordpress静态路由