二叉树题目:最大层内元素和

news2024/12/26 21:41:30

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:最大层内元素和

出处:1161. 最大层内元素和

难度

4 级

题目描述

要求

给定一个二叉树的根结点 root \texttt{root} root。设根结点位于二叉树的第 1 \texttt{1} 1 层,而根结点的子结点位于第 2 \texttt{2} 2 层,以此类推。

请返回最小 x \texttt{x} x,使得第 x \texttt{x} x 层的结点值之和最大

示例

示例 1:

示例 1

输入: root   =   [1,7,0,7,-8,null,null] \texttt{root = [1,7,0,7,-8,null,null]} root = [1,7,0,7,-8,null,null]
输出: 2 \texttt{2} 2
解释:
1 \texttt{1} 1 层各元素之和为 1 \texttt{1} 1
2 \texttt{2} 2 层各元素之和为 7   +   0   =   7 \texttt{7 + 0 = 7} 7 + 0 = 7
3 \texttt{3} 3 层各元素之和为 7   +   (-8)   =   -1 \texttt{7 + (-8) = -1} 7 + (-8) = -1
所以我们返回元素之和最大的层,为第 2 \texttt{2} 2 层。

示例 2:

输入: root   =   [989,null,10250,98693,-89388,null,null,null,-32127] \texttt{root = [989,null,10250,98693,-89388,null,null,null,-32127]} root = [989,null,10250,98693,-89388,null,null,null,-32127]
输出: 2 \texttt{2} 2

数据范围

  • 树中结点数目在范围 [1,   10 4 ] \texttt{[1, 10}^\texttt{4}\texttt{]} [1, 104]
  • -10 5 ≤ Node.val ≤ 10 5 \texttt{-10}^\texttt{5} \le \texttt{Node.val} \le \texttt{10}^\texttt{5} -105Node.val105

解法一

思路和算法

为了得到二叉树中结点值之和最大的层,需要计算二叉树的每一层的结点值之和。可以使用层序遍历实现。

从根结点开始依次遍历每一层的结点,在层序遍历的过程中需要区分不同结点所在的层,确保每一轮访问的结点为同一层的全部结点。遍历每一层结点之前首先得到当前层的结点数,即可确保每一轮访问的结点为同一层的全部结点。

对于每一层结点,遍历过程中可以得到当前层的结点值总和。

由于二叉树的第 1 1 1 层只有根结点,因此第 1 1 1 层的层内元素和即为根结点值。将最大层内元素和初始化为根结点值,将结点值之和最大的层初始化为第 1 1 1 层。遍历过程中,如果第 level \textit{level} level 层的结点值之和严格大于最大层内元素和,则将最大层内元素和更新为第 level \textit{level} level 层的结点值之和,将结点值之和最大的层更新为 level \textit{level} level。如果有多个层的结点值之和都是最大,则上述做法可以确保返回的层编号为其中最小的层编号。

代码

class Solution {
    public int maxLevelSum(TreeNode root) {
        int maxSum = root.val;
        int maxLevel = 1;
        int level = 0;
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            level++;
            int sum = 0;
            int size = queue.size();
            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;
                maxLevel = level;
            }
        }
        return maxLevel;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是队列空间,队列内元素个数不超过 n n n

解法二

思路和算法

也可以使用深度优先搜索得到二叉树中结点值之和最大的层。从根结点开始遍历二叉树,遍历过程中需要维护二叉树每一层的结点值总和。对于每个非空结点,都可以得到其结点值与所在层,将所在层的结点值总和加上当前结点值,然后对当前结点的非空子结点继续遍历。

遍历结束之后得到二叉树每一层的结点值总和,此时即可得到结点值之和最大的层。

代码

class Solution {
    int totalLevels = 0;
    List<Integer> sums = new ArrayList<Integer>() {{
        add(0);
    }};

    public int maxLevelSum(TreeNode root) {
        dfs(root, 1);
        int maxSum = root.val;
        int maxLevel = 1;
        for (int i = 2; i <= totalLevels; i++) {
            int sum = sums.get(i);
            if (sum > maxSum) {
                maxSum = sum;
                maxLevel = i;
            }
        }
        return maxLevel;
    }

    public void dfs(TreeNode node, int level) {
        totalLevels = Math.max(totalLevels, level);
        if (level < sums.size()) {
            sums.set(level, sums.get(level) + node.val);
        } else {
            sums.add(node.val);
        }
        if (node.left != null) {
            dfs(node.left, level + 1);
        }
        if (node.right != null) {
            dfs(node.right, level + 1);
        }
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间以及存储每一层的结点值总和的列表,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1009905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zookeeper可视化工具ZooInspector用法

最近在做银行的项目&#xff0c;用到了thrift&#xff0c;rpc和zookeeper&#xff0c;所有应用都是注册到zookeeper上的&#xff0c;想知道哪些应用注册上了&#xff0c;就用到ZooInspector这个可视化的工具。 1&#xff0c;下载 链接&#xff1a;https://issues.apache.org/…

flex弹性盒模型与阿里图标的使用

华子目录 flex布局flex布局原理flex使用三要素 阿里图标&#xff08;字体&#xff09; flex布局 相关学习网站&#xff1a;http://c.biancheng.net/css3/flex.html 1.flex是当前最主流的布局方式&#xff1a;用它布局起来更方便&#xff0c;取代了浮动的作用。 2.浮动布局有缺…

BUG:阿里巴巴图标库引入链接后,icon有时候会不显示的话svg下载到本地使用

忽然icon图标就不显示&#xff0c;但是代码、icon链接地址都没有发生变化 解决办法&#xff1a;将icon图标下载到本地&#xff0c;记住前后引用本地的名字要保持一致

学习jQuery库的第一天

简介 什么是 jQuery &#xff1f; jQuery 是一个广泛使用的 JavaScript 库。它简化了网页开发中常见的许多任务&#xff0c;例如 HTML 文档遍历、操作 HTML 元素、处理事件、动画效果、Ajax 网络请求等。通过使用 jQuery&#xff0c;开发人员可以更加高效地编写跨浏览器兼容的…

如何制作一个成功的超市购物小程序

随着互联网的普及和移动支付的便捷性&#xff0c;越来越多的消费者选择在网上购物&#xff0c;这也促使越来越多的商家开始搭建自己的小程序商城。对于超市便利店来说&#xff0c;拥有一个便捷、易用的小程序商城能够吸引更多的消费者&#xff0c;提高销售效率。那么如何快速搭…

MyBatis初级

文章目录 一、mybatis1、概念2、JDBC缺点2.1、之前jdbc操作2.2 、原始jdbc操作的分析 3、mybatis的使用3.1、导入maven依赖3.2、新建表3.3、实体类3.4、编写mybatis的配置文件3.5、编写接口 和 映射文件3.6、编写测试类3.7、注意事项 4、代理方式开发5、mybatis和spring整合5.1…

数学实验-最佳分数近似值(Mathematica实现)

一、实验名称&#xff1a;最佳分数近似值 二、实验环境&#xff1a;Mathematica 10.3软件 三、实验目的&#xff1a;研究怎样用分数近似值去对给定的无理数作最佳逼近&#xff0c;“最佳”就是既要误差小&#xff0c;又要分母小。我们首先需要对“最佳”定出具体而明确的标准…

动态IP代理是什么?一文看懂动态代理IP

一、什么是动态IP代理&#xff1f; 动态IP代理是一种代理服务&#xff0c;而动态IP是由ISP动态分配给用户的IP地址&#xff0c;这些IP地址会周期性地更改。每次链接互联网时&#xff0c;用户会被分配一个新的IP地址&#xff0c;因而也称为”轮换IP”。 IP地址轮换是一个过程&…

Roreg复现

一、roreg复现 [github链接][参考] 1.1 报错1 Traceback (most recent call last): File "setup.py", line 52, in <module> import torch File "/home/w/anaconda3/envs/pty_roreg/lib/python3.7/site-packages/torch/__init__.py", line …

公司中一个好的管理者应该是什么样的?

一个好的管理者&#xff0c;不仅在公司中发挥着至关重要的作用&#xff0c;而且能够对组织的成功和员工的幸福产生深远的影响。那么&#xff0c;一个好的管理者应该具备哪些特质和技能呢&#xff1f;以下是我根据现有研究和经验总结出来的一些观点。 强大的领导力&#xff1a;…

【干货超全】国内外常见的Ai大模型汇总!!!

国内外常见的Ai大模型汇总: 点击文字即可跳转 1&#xff09;国内 讯飞星火大模型 https://xinghuo.xfyun.cn 百度文心一言 https://yiyan.baidu.com 阿里通义千问 https://tongyi.aliyun.com 华为盘古大模型 https://pangu.huaweicloud.com/ 清华智谱清言链接&#xff1…

卖课不挣钱,为什么还要卖?背后原因你绝对想不到

#职场经验谈# 大家好&#xff0c;这里是程序员晚枫&#xff0c;全网同名。 这几年一直在维护一个开源项目&#xff1a;python-office&#xff0c;GitHub和gitee都能搜索到。 我今晚算了一下&#xff0c;在维护这个开源项目的过程中&#xff0c;通过技术答疑、制作课程、发布广…

观测云接入 NewRelic .NET 探针

背景 部分客户系统采用的是.NET 4.5 部署研发的、基于 IIS 进行发布的 Web 项目&#xff0c;需要接入到观测云进行链路信息展示&#xff0c;ddtrace 和 otel 对于低版本.NET 支持力度有限。 环境信息 IIS 4.0.NET core 4.0、4.5、4.6Window Server 2012 R2 域名配置 准备一…

释放数据价值这道难题,Smartbi V11有解

《未来简史》预言&#xff1a;数据将成为人们未来的信仰。 未来已来&#xff0c;将至已至。如今&#xff0c;数据所扮演的角色与作用超乎想象。从政府将数据要素列入生产要素之中&#xff0c;到数据驱动型业务场景涌现&#xff0c;企业与组织对于数据及其价值的认可度明显提升…

【皇帝的新装】从不一样的视角看OKR

OKR是“目标和关键成果”&#xff0c;是企业进行目标管理的一个简单有效的系统&#xff0c;能够将目标管理自上而下贯穿到基层&#xff1b;为什么公司和个人都要用OKR&#xff1f; 一、Why 我们分两点来谈“为什么要用OKR”&#xff0c;一个点是“我们公司&#xff08;老板&am…

【Linux】—— 在Linux上进行读写文件操作

前言&#xff1a; 在之前&#xff0c;我已经对进程的相关知识进行了详细的介绍。本期开始&#xff0c;我们将要学习的是关于 “基础I/O”的知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;C文件接口 &#xff08;二&#xff09;系统文件I/O 1、接…

git中无法使用方向键的问题

windows下使用git命令行执行react脚本安装&#xff0c;发现无法使用上下键来去选中选项。最后只能换成cmd命令执行&#xff0c;发现可以上下移动以选中需要的选项。 bash命令行&#xff1a;移动光标无法移动选项 cmd命令行

为职场注入新活力,中国人民大学与加拿大女王大学金融硕士项目伴你追光而行

在金融职场从业多年的你&#xff0c;是否觉得有点疲惫呢&#xff0c;踏入职场一路过关闯将走到了今天&#xff0c;居于中高层管理的你是否需要注入新的能量呢&#xff0c;中国人民大学与加拿大女王大学金融硕士项目为你带来全新的课程体验&#xff0c;伴你追光而行。 中国人民大…

GitHub项目管理详细教程/git教程【有图有代码】

GitHub项目管理详细教程/git教程【有图有代码】 一、Git 基本操作二、Git 配置1、配置个人的用户名称和电子邮件地址2、查看配置信息 三、Git 工作区、暂存区和版本库四、上传自己的项目到GitHub仓库第一次第二次分支操作 在使用GitHub进行项目管理的之前&#xff0c;首先需要自…

【Java实习评审】对推电影详情模块的功能扩展预期有一定的代码实现

大家好&#xff0c;本篇文章分享【校招VIP】免费商业项目“推电影”第一期电影详情模块Java同学的代码周最佳作品。该同学来【安庆师范大学】“电子信息”专业。 1、本项目是基于年轻人的喜好&#xff0c;更个性的电影推荐网站。筛选各分类的知名电影&#xff0c;并给出推荐理…