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

文章目录

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

题目

标题和出处

标题:最大层内元素和

出处: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.rhkb.cn/news/132303.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端vue按钮控制切换按钮是否禁用和颜色和显示隐藏,利用v-if和v-else

效果 未输入input前图片 输入input后图片 html (1) <input type"number" placeholder"请输入分润数量" placeholder-class"shareprofit_placeholder_num" v-model"money"> <!-- 金钱 --> {{money}} <!-- 可提现余额…

Generative Adversarial Nets

Author:龙箬 Computer Application Technology Change the World with Data and Artificial Intelligence ! CSDNweixin_43975035 生命不息&#xff0c;折腾不止 Reference&#xff1a; [1] Goodfellow, I, Pouget-Abadie, J, Mirza, M, Xu, B, Warde-Farley, D, Ozair, S, Co…

【绝㊙️】三年开发内功心得

经典嵌套if-else问题 这个也是老生常谈问题了&#xff0c;不管哪里都能看到。 那如何解决 方法一&#xff08;重要&#xff09;&#xff1a; 如果逻辑分支过多&#xff0c; 即使你不解决嵌套if-slse&#xff0c;至少也要把每个 if的{}里的逻辑抽到一个独立的方法或者工具类…

Vue中extend基本用法

1.Vue.extend(options) 参数: {Object} options用法&#xff1a; 使用基础Vue构造器&#xff0c;创建一个"子类"。参数是一个包含组件选项的对象。 data选项是特例&#xff0c;需要注意&#xff0c;在Vue.extend()中它必须是函数。 <html><head><tit…

Unity中Shader抓取屏幕并实现扭曲效果(优化)

文章目录 前言一、在之前顶点着色器的输入中&#xff0c;放弃了使用结构体传入&#xff0c;而是直接从应用程序阶段传入参数&#xff0c;这样写的话&#xff0c;对于程序来说&#xff0c;不方便扩张&#xff0c;所以需要对其进行修改实现1、定义结构体用于传入顶点坐标系2、因为…

离散数学 学习 之 一阶逻辑基本概念 ( 四 )

好好理解这个 代换实例&#xff0c;每个 谓词公式 都替换一个 命题公式 在蕴含式 中 &#xff0c;只有前式 为 假 &#xff0c;后式 为 真&#xff0c;这个式才是假的 &#xff0c;可以利用 这个进行判断 找个 成真解释 &#xff0c;找个 成假 解释 不能 替换 才去 找 解释 &…

C++信息学奥赛1171:大整数的因子

该程序是一个寻找能够整除输入数字的最小正整数的程序。下面是代码的逻辑解析&#xff1a; #include <iostream> #include <string> #include <cstring>using namespace std;int main() {string n; // 定义一个字符串变量nint fale 0; // 用于标记是否能…

C++学习笔记二(堆栈、指针、命名空间、编译步骤)

C 1、堆和栈2、指针2.1、指针的本质2.2、指针的意义2.3、清空指针2.4、常量指针和指针常量2.4.1、常量指针&#xff08;const int *p;&#xff09;2.4.2、指针常量&#xff08;int *const p;&#xff09; 2.5、C类中的this 3、malloc and new4、命名空间4.1、创建命名空间4.2、…

使用nvm管理node.js

使用nvm管理node.js 一、简介 nvm是一个node的版本管理工具。可以在多种系统上管理Node.js 版本的工具。使用 NVM&#xff0c;可以轻松地切换不同版本的Node.js&#xff0c;并方便地管理不同版本的全局包和本地包。 二、安装与下载 1.删除原有node.js 首先需要卸载已安装的…

[BJDCTF2020]ZJCTF,不过如此 preg_replace /e模式漏洞

目录 preg_replace的/e模式 为什么要变为 {${phpinfo()}} 另一个方法 版本 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream")){echo &qu…

PlantUML——类图(持续更新)

前言 在分析代码流程中&#xff0c;我们常常会使用到各种UML图&#xff0c;例如用例图、时序图和类图等&#xff0c;以往使用ProcessOn或亿图图示等工具&#xff0c;但是这些工具难以规范化&#xff0c;有没有一种用代码来生成图形的工具呢&#xff1f; 刚好在出差的晨会中机缘…

SpringBoot入门

1.SpringBoot简介 1.1SpringBoot是什么&#xff1f; Spring Boot是基于Spring开发的全新框架&#xff0c;相当于对Spring做了又一层封装。 其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样…

IO多路复用(select模型实现监控两个设备:自定义设备和鼠标设备)

1、驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #include <linux/fs.h> #include <linux/io.h> #include <linux/slab.h> #include <linux/wait.h> #include <linux/uaccess.h> #i…

4核8G服务器腾讯云CVM S5性能如何?CPU型号及租用价格

腾讯云4核8G服务器CVM标准型S5实例性能测评&#xff0c;包括CPU型号、内存、系统盘、CVM实例规格性能测评&#xff0c;腾讯云4核8G租用优惠价格表&#xff0c;腾讯云服务器网分享腾讯云4核8G服务器CVM S5性能测评和租用费用&#xff1a; 目录 腾讯云4核8G服务器CVM S5性能测评…

Apinto 网关: Go语言实现 HTTP 转 gRPC

gRPC 是由 Google 开发的一个高性能、通用的开源RPC框架&#xff0c;主要面向移动应用开发且基于 HTTP/2 协议标准而设计&#xff0c;同时支持大多数流行的编程语言。 gRPC 基于 HTTP/2 协议传输&#xff0c; HTTP/2 相比 HTTP1.x有以下优势: 采用二进制格式传输协议&#xff…

《C++ Primer》第3章 字符串、向量和数组(三)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 3.5 数组&#xff08;P101&#xff09; 数组类似于 vector &#xff0c;不同点在于数组的大小固定不变&#xff0c;在某些情况下性能较好&#xff0c;但灵活性较差。 3.5.1 定义和初始化内置数组&#xff…

SpringBoot项目中使用poi-tl打成jar包后常见问题及解决

目录 前言 一、场景描述 1、打成jar包运行后模板找不到 2、文件只能下载一次 二、正确示范 1、Controller下载方法定义 2、文档生成 总结 前言 在前面的博客中&#xff0c;介绍了如何在Java中根据模板动态写入数据到word模板中&#xff0c;原文地址&#xff1a;Java使用…

Pandas数据分析一览-短期内快速学会数据分析指南(文末送书)

前言 三年耕耘大厂数据分析师&#xff0c;有些工具是必须要掌握的&#xff0c;尤其是Python中的数据分析三剑客&#xff1a;Pandas&#xff0c;Numpy和Matplotlib。就以个人经验而已&#xff0c;Pandas是必须要掌握的&#xff0c;它提供了易于使用的数据结构和数据操作工具&am…

第69步 时间序列建模实战:ARIMA建模(R)

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用R进行SARIMA模型的构建。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Re…

uniapp小程序 - 隐私协议保护指引接入教程

文章目录 前提&#xff1a;__usePrivacyCheck__: true步骤一、封装弹窗组件步骤二、单个页面引用一、被动监听二、主动查询 前言&#xff1a;官方发布公告&#xff0c;自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;仅当开发者主动向平台同…