资讯详情

二叉树层序遍历与最大层和算法解析

📅 2026/10/28 17:15:13 | 华诺云谱 👁 阅读
二叉树层序遍历与最大层和算法解析
1. 题目解析与核心思路这道题目要求我们找到二叉树中元素和最大的那一层并返回该层的层号从1开始计数。乍一看可能觉得简单但实际处理时需要综合考虑几个关键点首先明确几个概念层内元素和同一深度所有节点值的总和最大层所有层中元素和最大的那一层层号定义根节点所在层为第1层1.1 题目示例分析假设有如下二叉树1 / \ 7 0 / \ 7 -8各层元素和计算如下第1层1 → 和为1第2层7 0 7第3层7 (-8) -1因此最大和为7出现在第2层应返回2。1.2 解题思路选择解决这个问题主要有两种思路深度优先搜索(DFS)通过递归遍历记录每层的和广度优先搜索(BFS)通过队列实现层序遍历逐层计算和对于这个问题BFS层序遍历是更直观的选择因为题目本身就要求按层处理BFS天然按层遍历不需要额外维护层号信息代码实现更直观容易理解2. BFS层序遍历实现2.1 基础BFS框架标准的BFS层序遍历模板如下from collections import deque def levelOrder(root): if not root: return [] queue deque([root]) result [] while queue: level_size len(queue) current_level [] for _ in range(level_size): node queue.popleft() current_level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.append(current_level) return result2.2 本题的BFS变种我们需要在标准BFS基础上做以下调整不记录每层的节点值而是计算每层的和跟踪当前最大的和及其对应的层号处理空树的边界情况实现代码from collections import deque def maxLevelSum(root): if not root: return 0 queue deque([root]) max_sum float(-inf) max_level 1 current_level 1 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) if level_sum max_sum: max_sum level_sum max_level current_level current_level 1 return max_level2.3 复杂度分析时间复杂度O(N)其中N是树中节点的数量。每个节点恰好被访问一次。 空间复杂度O(M)其中M是树的最大宽度最宽层的节点数。在最坏情况下完全平衡树队列中最多存储N/2个节点。3. DFS递归解法虽然BFS更适合本题但为了全面性我们也可以看看DFS的实现方式。3.1 DFS实现思路DFS需要额外维护一个字典或列表来记录各层的和当前遍历的深度信息实现代码def maxLevelSum(root): level_sums [] def dfs(node, level): if not node: return if level len(level_sums): level_sums.append(0) level_sums[level] node.val dfs(node.left, level 1) dfs(node.right, level 1) dfs(root, 0) if not level_sums: return 0 max_sum max(level_sums) return level_sums.index(max_sum) 1 # 转换为1-based3.2 DFS与BFS对比特性BFSDFS适用场景需要按层处理的问题需要深度优先遍历的问题空间复杂度O(M) M为最大宽度O(H) H为树的高度实现难度中等需要队列操作简单直接递归本题适用性更直观符合题目要求需要额外维护层信息4. 边界条件与异常处理在实际编码中我们需要考虑以下边界情况4.1 空树处理if not root: return 0 # 或者根据题目要求返回其他值4.2 所有节点值为负数算法应该能正确处理这种情况找到最大的和即最小的负数。4.3 多个层具有相同最大和根据题目要求应该返回层号最小的那个。我们的实现天然满足这一条件因为是从上到下遍历遇到更大的和才更新。5. 代码优化与技巧5.1 提前终止优化如果我们已经遍历到某一层其和已经大于剩余所有层可能的最大和可以提前终止。不过对于一般二叉树这种优化效果有限。5.2 使用列表代替字典在DFS实现中使用列表记录各层和比字典更高效因为层号是连续的整数。5.3 避免全局变量在DFS实现中我们使用了嵌套函数来避免使用全局变量使代码更干净。6. 测试用例设计全面的测试用例应该包括普通二叉树# 输入 # 1 # / \ # 7 0 # / \ # 7 -8 # 预期输出2单节点树# 输入 [1] # 预期输出1所有层和相同# 输入 # 1 # / \ # 1 1 # 预期输出1 (返回最小的层号)所有节点为负数# 输入 # -1 # / \ # -2 -3 # 预期输出1不平衡树# 输入 # 1 # \ # 2 # \ # 3 # 预期输出37. 语言特定实现7.1 Java实现class Solution { public int maxLevelSum(TreeNode root) { if (root null) return 0; QueueTreeNode queue new LinkedList(); queue.offer(root); int maxSum Integer.MIN_VALUE; int maxLevel 1; int currentLevel 1; while (!queue.isEmpty()) { int levelSize queue.size(); int levelSum 0; for (int i 0; i levelSize; i) { TreeNode node queue.poll(); levelSum node.val; if (node.left ! null) queue.offer(node.left); if (node.right ! null) queue.offer(node.right); } if (levelSum maxSum) { maxSum levelSum; maxLevel currentLevel; } currentLevel; } return maxLevel; } }7.2 C实现class Solution { public: int maxLevelSum(TreeNode* root) { if (!root) return 0; queueTreeNode* q; q.push(root); int max_sum INT_MIN; int max_level 1; int current_level 1; while (!q.empty()) { int level_size q.size(); int level_sum 0; for (int i 0; i level_size; i) { TreeNode* node q.front(); q.pop(); level_sum node-val; if (node-left) q.push(node-left); if (node-right) q.push(node-right); } if (level_sum max_sum) { max_sum level_sum; max_level current_level; } current_level; } return max_level; } };8. 常见错误与调试8.1 忘记处理空树这是最常见的错误之一总是应该首先检查root是否为null。8.2 层号计数错误容易混淆0-based和1-based的层号。题目明确要求根节点是第1层。8.3 队列操作错误在BFS中常见的错误包括忘记popleft/弹出队列首元素在循环内错误计算队列大小添加子节点时没有检查是否为null8.4 最大和初始化max_sum应该初始化为负无穷大而不是0因为树中可能有所有节点都是负数的情况。9. 实际应用场景这类二叉树层序遍历的问题在实际开发中有广泛的应用数据库索引优化B树/B树的层级分析游戏开发场景树的层级渲染UI框架组件树的层级布局网络路由路由表的层级查找组织结构管理公司层级架构分析理解这类算法有助于解决更复杂的层级数据结构问题。10. 扩展思考10.1 如果要求返回所有最大和的层号当多个层具有相同的最大和时返回所有层号的列表。这时我们需要维护一个列表记录所有最大和的层号当遇到新的最大和时清空列表当遇到等于当前最大和时添加到列表10.2 非递归DFS实现可以使用栈来实现DFS的迭代版本同时记录节点和对应的层号def maxLevelSum(root): if not root: return 0 stack [(root, 0)] level_sums [] while stack: node, level stack.pop() if level len(level_sums): level_sums.append(0) level_sums[level] node.val if node.right: stack.append((node.right, level 1)) if node.left: stack.append((node.left, level 1)) max_sum max(level_sums) return level_sums.index(max_sum) 110.3 并行计算优化对于非常大的树可以考虑并行计算各层的和。BFS的每层计算天然可以并行化。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑