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

LeetCode算法题(Go语言实现)_40

题目

给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。
请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。

一、代码实现

import "math"

func maxLevelSum(root *TreeNode) int {
    if root == nil {
        return 0
    }
    
    queue := []*TreeNode{root}
    maxSum := math.MinInt64
    result := 0
    level := 1
    
    for len(queue) > 0 {
        size := len(queue)
        sum := 0
        for i := 0; i < size; i++ {
            node := queue[0]
            queue = queue[1:]
            sum += node.Val
            
            if node.Left != nil {
                queue = append(queue, node.Left)
            }
            if node.Right != nil {
                queue = append(queue, node.Right)
            }
        }
        
        if sum > maxSum {
            maxSum = sum
            result = level
        }
        level++
    }
    
    return result
}

二、算法分析

1. 核心思路
  • 层次遍历(BFS):利用队列实现广度优先搜索,逐层计算节点值之和
  • 动态极值追踪:实时比较并更新最大层和及其对应最小层号
2. 关键步骤
  1. 队列初始化:根节点入队
  2. 层级统计:记录当前层节点数,遍历时累加节点值
  3. 极值更新:比较当前层和与历史最大值,更新最大值及对应层号
  4. 层级递进:处理完每层后递增层号计数器
3. 复杂度
指标说明
时间复杂度O(n)每个节点遍历一次
空间复杂度O(n)队列最大存储空间为最宽层节点数

三、图解示例

在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 空树:返回0
  • 单节点树:返回层号1
  • 负数和层:正确识别负数层和的最大值
  • 平局层和:返回最先出现的较小层号
2. 多语言实现
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

from collections import deque

class Solution:
    def maxLevelSum(self, root: TreeNode) -> int:
        if not root:
            return 0
        
        max_sum = float('-inf')
        result_level = 0
        level = 1
        queue = deque([root])
        
        while queue:
            level_sum = 0
            level_size = len(queue)
            
            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
                result_level = level
            level += 1
        
        return result_level
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

class Solution {
    public int maxLevelSum(TreeNode root) {
        if (root == null) return 0;
        
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int maxSum = Integer.MIN_VALUE;
        int result = 0;
        int level = 1;
        
        while (!queue.isEmpty()) {
            int size = queue.size();
            int sum = 0;
            
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                sum += node.val;
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
            
            if (sum > maxSum) {
                maxSum = sum;
                result = level;
            }
            level++;
        }
        
        return result;
    }
}

五、总结与扩展

1. 核心创新点
  • 层级聚合策略:利用BFS天然分层特性实现高效统计
  • 极值双维护机制:同步维护最大值和最小层号两个状态量
2. 扩展应用
  • 三维层级分析:处理多个平行树结构的层级统计
  • 动态权重求和:支持节点带权重的层级统计
  • 分布式计算:对超宽层级进行分片并行计算
3. 工程优化
  • 内存池技术:预分配节点存储空间减少GC压力
  • 层级缓存:实现层级结果的持久化存储
  • 增量更新:支持动态树的增量层级统计

相关文章:

  • UNIX域套接字(Unix Domain Sockets, UDS) 的两种接口
  • FOUPK3system5XOS系统19.60 (FOUPK3system5XOSONSX9内核)Application开源计划1.0正式发布
  • 通过AWS EKS 生成并部署容器化应用
  • VRRP学习
  • Postgresql安装mysql_fdw并映射MySQL数据库
  • 在图像处理领域,什么是缓冲区堆积问题
  • es的告警信息
  • Java学习——day27(线程间通信与死锁防范)
  • 数据可视化 —— 多边图应用(大全)
  • SageAttention2
  • 设计一个简单的权限管理系统
  • Shell 编程之条件语句
  • 项目文章 ▏磷酸化依赖的VaMYB4a通过抑制VaPIF3和激活VaCBF4调节葡萄藤冷胁迫
  • 蓝桥杯备战
  • 传统门店VS智慧门店:电能物联网平台在连锁行业的节能应用
  • 线代第五课:行列式按一行(列)展开
  • Ubuntu ROS 对应版本
  • 破解root密码
  • 力扣 — — 最长公共子序列
  • 【游戏安全】基于协议场景的挖掘
  • 最快网站备案/seo优化网站
  • 怎么做网站链接支付/网站如何做推广
  • 睢宁网站建设/windows优化大师怎么使用
  • 仿励志一生网站整站源码 带数据/推广普通话海报
  • 如何查询网站备案/什么是网络营销渠道
  • 专做火影黄图的网站/jsurl转码