news 2026/9/11 13:25:57

二叉树最深叶子节点和的DFS与BFS实现解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉树最深叶子节点和的DFS与BFS实现解析

1. 问题背景与理解

今天遇到一道挺有意思的二叉树题目——"1302 层数最深叶子节点的和"。简单来说,就是给定一棵二叉树,要求计算其最深一层叶子节点值的总和。这个问题看似简单,但实际考察了对二叉树遍历、深度计算和递归/迭代的理解。

举个例子,假设有这样一棵二叉树:

1 / \ 2 3 / \ \ 4 5 6 / \ 7 8

在这棵树中,最深层是第4层,叶子节点是7和8,所以结果应该是7+8=15。

2. 解题思路分析

2.1 深度优先 vs 广度优先

面对这个问题,首先想到的是两种经典遍历方式:

  1. 深度优先搜索(DFS):可以递归地遍历树,记录当前深度,当遇到更深节点时更新结果
  2. 广度优先搜索(BFS):按层遍历,最后一层的节点和就是所求结果

提示:对于这种需要知道最深层的题目,BFS按层遍历的思路通常更直观

2.2 递归实现细节

如果用DFS递归实现,需要考虑几个关键点:

  • 如何记录当前深度?
  • 如何判断是否到达更深层?
  • 如何累加最深层的节点值?

递归函数可以设计为:

def dfs(node, depth): nonlocal max_depth, total if not node: return if depth > max_depth: max_depth = depth total = node.val elif depth == max_depth: total += node.val dfs(node.left, depth+1) dfs(node.right, depth+1)

2.3 迭代实现方案

BFS的迭代实现通常使用队列,可以这样处理:

  1. 初始化队列包含根节点
  2. 当队列不为空时:
    • 记录当前层节点数
    • 处理完当前层后,如果下一层非空则更新结果
    • 否则当前层就是最深层,返回结果

3. 完整代码实现

3.1 Python递归解法

class Solution: def deepestLeavesSum(self, root: TreeNode) -> int: self.max_depth = 0 self.total = 0 def dfs(node, depth): if not node: return if depth > self.max_depth: self.max_depth = depth self.total = node.val elif depth == self.max_depth: self.total += node.val dfs(node.left, depth+1) dfs(node.right, depth+1) dfs(root, 0) return self.total

3.2 Python迭代解法

from collections import deque class Solution: def deepestLeavesSum(self, root: TreeNode) -> int: if not root: return 0 queue = deque([root]) result = 0 while queue: level_size = len(queue) level_sum = 0 for _ in range(level_size): node = queue.popleft() level_sum += node.val if node.left: queue.append(node.left) if node.right: queue.append(node.right) result = level_sum return result

3.3 复杂度分析

两种方法的时间复杂度都是O(N),需要遍历所有节点:

  • 递归:空间复杂度O(H),H是树高(递归栈深度)
  • 迭代:空间复杂度O(W),W是树的最大宽度

4. 常见问题与优化

4.1 空树处理

两种实现都需要考虑空树的情况:

if not root: return 0

4.2 递归深度限制

对于非常深的树,Python默认递归深度可能不够(通常是1000),可以修改递归限制:

import sys sys.setrecursionlimit(100000)

4.3 内存优化

对于BFS实现,可以在处理完一层后立即释放内存:

for _ in range(level_size): node = queue.popleft() # ...处理节点... del node # 显式释放内存

5. 实际应用场景

这类二叉树深度相关的问题在实际中有多种应用:

  1. 文件系统目录深度统计
  2. 组织结构图层级分析
  3. 游戏AI中的决策树评估
  4. 网络路由跳数计算

我在实际项目中曾用类似方法分析过网站导航结构的深度,帮助优化用户体验。发现超过4层的导航结构会显著降低用户留存率,这个发现直接指导了我们的界面 redesign。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 13:25:14

COMSOL实现完美电磁波吸收器的建模与优化

1. 完美吸收器的物理世界与COMSOL实现路径在电磁波与物质相互作用的研究中,完美吸收器(Perfect Absorber)代表着一种能够近乎100%捕获特定频段电磁波的人工结构。这类器件在太阳能收集、隐身技术和光电检测等领域具有重要应用价值。COMSOL Mu…

作者头像 李华
网站建设 2026/9/11 13:24:20

楼顶大字广告制作工艺与安全规范全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 13:19:29

Vue.js开发实战:从入门到构建完整网站

1. 为什么选择Vue.js开发网站?Vue.js作为一款渐进式JavaScript框架,近年来在前端开发领域迅速崛起。我最初接触Vue是在2016年,当时还在使用jQuery和AngularJS开发项目。Vue的轻量级和易上手特性让我眼前一亮——它不像Angular那样需要学习大量…

作者头像 李华
网站建设 2026/9/11 13:19:26

Python包管理工具pip的核心功能与优化实践

1. Python包管理工具pip的核心价值作为Python生态的基石工具,pip在2023年仍然是开发者日常使用频率最高的命令行工具之一。根据PyPI官方统计,全球Python开发者平均每天通过pip执行超过2000万次包安装操作。不同于其他语言的包管理工具,pip具有…

作者头像 李华