二叉树的层平均值[中等]

优质博文:IT-BLOG-CN

一、题目

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第0层的平均值为3,第1层的平均值为14.5,第2层的平均值为11
因此返回[3, 14.5, 11]

示例 2:

输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]

树中节点数量在[1, 104]范围内
-231 <= Node.val <= 231 - 1

二、代码

【1】深度优先搜索: 使用深度优先搜索计算二叉树的层平均值,需要维护两个数组,counts用于存储二叉树的每一层的节点数,sums用于存储二叉树的每一层的节点值之和。搜索过程中需要记录当前节点所在层,如果访问到的节点在第i层,则将counts[i]的值加1,并将该节点的值加到sums[i]。遍历结束之后,第i层的平均值即为sums[i]/counts[i]

class Solution {public List<Double> averageOfLevels(TreeNode root) {List<Integer> counts = new ArrayList<Integer>();List<Double> sums = new ArrayList<Double>();dfs(root, 0, counts, sums);List<Double> averages = new ArrayList<Double>();int size = sums.size();for (int i = 0; i < size; i++) {averages.add(sums.get(i) / counts.get(i));}return averages;}public void dfs(TreeNode root, int level, List<Integer> counts, List<Double> sums) {if (root == null) {return;}if (level < sums.size()) {sums.set(level, sums.get(level) + root.val);counts.set(level, counts.get(level) + 1);} else {sums.add(1.0 * root.val);counts.add(1);}dfs(root.left, level + 1, counts, sums);dfs(root.right, level + 1, counts, sums);}
}

时间复杂度: O(n),其中n是二叉树中的节点个数。深度优先搜索需要对每个节点访问一次,对于每个节点,维护两个数组的时间复杂度都是O(1),因此深度优先搜索的时间复杂度是O(n)。遍历结束之后计算每层的平均值的时间复杂度是O(h),其中h是二叉树的高度,任何情况下都满足h≤n。因此总时间复杂度是O(n)
空间复杂度: O(n),其中n是二叉树中的节点个数。空间复杂度取决于两个数组的大小和递归调用的层数,两个数组的大小都等于二叉树的高度,递归调用的层数不会超过二叉树的高度,最坏情况下,二叉树的高度等于节点个数。

【2】广度优先搜索: 也可以使用广度优先搜索计算二叉树的层平均值。从根节点开始搜索,每一轮遍历同一层的全部节点,计算该层的节点数以及该层的节点值之和,然后计算该层的平均值。如何确保每一轮遍历的是同一层的全部节点呢?我们可以借鉴层次遍历的做法,广度优先搜索使用队列存储待访问节点,只要确保在每一轮遍历时,队列中的节点是同一层的全部节点即可。具体做法如下:
1、初始时,将根节点加入队列;
2、每一轮遍历时,将队列中的节点全部取出,计算这些节点的数量以及它们的节点值之和,并计算这些节点的平均值,然后将这些节点的全部非空子节点加入队列,重复上述操作直到队列为空,遍历结束。

由于初始时队列中只有根节点,满足队列中的节点是同一层的全部节点,每一轮遍历时都会将队列中的当前层节点全部取出,并将下一层的全部节点加入队列,因此可以确保每一轮遍历的是同一层的全部节点。具体实现方面,可以在每一轮遍历之前获得队列中的节点数量size,遍历时只遍历size个节点,即可满足每一轮遍历的是同一层的全部节点。

class Solution {public List<Double> averageOfLevels(TreeNode root) {List<Double> averages = new ArrayList<Double>();Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {double sum = 0;int size = queue.size();for (int i = 0; i < size; i++) {TreeNode node = queue.poll();sum += node.val;TreeNode left = node.left, right = node.right;if (left != null) {queue.offer(left);}if (right != null) {queue.offer(right);}}averages.add(sum / size);}return averages;}
}

时间复杂度: O(n),其中n是二叉树中的节点个数。广度优先搜索需要对每个节点访问一次,时间复杂度是O(n)。需要对二叉树的每一层计算平均值,时间复杂度是O(h),其中h是二叉树的高度,任何情况下都满足h≤n。因此总时间复杂度是O(n)
空间复杂度: O(n),其中n是二叉树中的节点个数。空间复杂度取决于队列开销,队列中的节点个数不会超过n

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

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

相关文章

外置固态硬盘配置

1、插上usb外置硬盘盒 2、邮件我的此“电脑”选择“管理” 3、例如新增的固态硬盘如下&#xff1a; 4、这里我选择mrb(旧模式)而没选guid(新模式) 因为mrb兼容模式更加适合windows、ios等系统 5、右击未分区磁盘&#xff0c;选择新增卷区&#xff0c;一路下一步即可

《俏丽》正规万方收录普刊投稿发表

《俏丽》期刊是国家新闻出版总署批准的正规期刊&#xff0c;万方期刊网收录。安排文化、教育相关稿件&#xff0c;适用于评职称时的论文发表&#xff08;单位有特殊要求除外&#xff09;&#xff0c;具体投稿方式请小窗我。 收稿方向、栏目参考&#xff1a;教育研究、课堂教学…

Python正则

match()和search()方法是re模块中用于正则表达式匹配的两个函数&#xff0c;而不是research()。 match()方法从字符串开头开始匹配&#xff0c;只有当模式从字符串的起始位置开始匹配成功时才会返回匹配对象。如果模式无法从字符串起始位置匹配成功&#xff0c;则返回None。 …

C语言课程设计

内容与设计思想 1、系统功能与分析&#xff08;填写你所设计的菜单及流程图&#xff09;。 菜单&#xff1a; 日历打印 日历推算 日历间隔倒计时牌 退出程序 模块设计 根据功能需要&#xff1a; 源文件&#xff1a; #include<stdio.h> #include&…

采样率越高噪声越大?

ADC采样率指的是模拟到数字转换器&#xff08;ADC&#xff09;对模拟信号进行采样的速率。在数字信号处理系统中&#xff0c;模拟信号首先通过ADC转换为数字形式&#xff0c;以便计算机或其他数字设备能够处理它们。 ADC采样率通常以每秒采样的次数来表示&#xff0c;单位为赫…

用Pandas轻松进行7项基本数据检查

大家好&#xff0c;作为一名数据工程师&#xff0c;面对糟糕的数据质量&#xff0c;可以使用Pandas执行快捷的数据质量检查。本文使用scikit-learn提供的California Housing数据集&#xff0c;进行基本数据检查。 一、California Housing数据集概述 【数据集】&#xff1a; …

【管理运筹学】背诵手册(七)| 网络计划与排队论

七、网络计划 网络图中的第一个事项称为起始事项&#xff0c;它只表示整个任务的开始&#xff1b;而最后一个事项称为终止事项&#xff0c;它只表示整个任务的结束&#xff1b;介于起始事项和终止事项之间的所有事项都称为中间事项&#xff0c;它既表示前项工作的结束&#xf…

智能优化算法应用:基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.广义正态分布算法4.实验参数设定5.算…

智能优化算法应用:基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于原子轨道搜索算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定5.算…

Python 作业答疑_6.15~6.18

一、Python 一班 1. 比较字符串 1.1 问题描述 比较两个字符串A和B&#xff0c;字符串A和B中的字符都是大写字母&#xff0c;确定A中是否包含B中所有的字符。 1.2 问题示例 例如&#xff0c;给出A"ABCD"&#xff0c;B"ACD"&#xff0c;返回True&#x…

硬件基础:差模和共模

一直以来&#xff0c;都难以理解差模和共模这两个概念&#xff0c;什么差分信号、差模信号、共模信号&#xff0c;差模干扰、共模干扰……虽然看了一些资料&#xff0c;但貌似说法还挺多的&#xff0c;理解起来仍然是一头雾水。所以&#xff0c;专门用一篇文章来好好研究下这个…

结构体对齐和补齐

结构体的对齐和补齐的规则&#xff1a; 对齐&#xff1a;假定从零地址开始&#xff0c;每成员的起始地址编号&#xff0c;必须是它本身字节数的整数倍。 补齐&#xff1a;结构的总字节数必须是它最大成员的整数倍。 注意&#xff1a;在Linux系统下计算补齐、对齐时&#xff0c;…

算法学习系列(六):高精度加法、减法、乘法、除法

目录 引言一、高精度加法1.题目描述2.代码实现3.测试 二、高精度减法1.题目描述2.代码实现3.测试 三、高精度乘法1.题目描述2.代码实现3.测试 四、高精度除法1.题目描述2.代码实现3.测试 引言 本文介绍了高精度加法、高精度减法、高精度乘法、高精度除法&#xff0c;这个高精度…

软件开发自动化到智能文档检索:大语言模型驱动的开源项目盘点 | 开源专题 No.46

shroominic/codeinterpreter-api Stars: 2.4k License: MIT 这是一个 ChatGPT 代码解释器的开源实现项目&#xff0c;使用了 LangChain 和 CodeBoxes 进行后端沙盒式 Python 代码执行。该项目具有以下特性和优势&#xff1a; 数据集分析、股票图表绘制、图像处理等功能支持网…

KubeSphere Marketpalce 上新!Databend Playground 助力快速启动数据分析环境

12 月 5 日&#xff0c;Databend Labs 旗下 Databend Playground&#xff08;社区尝鲜版&#xff09;成功上架青云科技旗下 KubeSphere Marketplace 云原生应用扩展市场&#xff0c;为用户提供一个快速学习和验证 Databend 解决方案的实验环境。 关于 Databend Playground Dat…

Flask之手搓bootstrap翻页

使用bootstrap框架的翻页组件时&#xff0c;记起在学习使用laravel框架的时候&#xff0c;只需要添加相应的功能代码&#xff0c;就可以直接使用翻页组件了&#xff0c;但缺少自定义&#xff0c;或者说自定义起来有点麻烦。 自己手搓翻页组件&#xff0c;不仅能加深对flask的认…

Java架构师系统架构设计服务拆分应用

目录 1 概论2 微服务应用的分层架构-阿里系应用内部模块分层3 如何从不同维度对服务进行拆分4【案例分析】阿里新零售业务的微服务拆分5 如何理解微服务的无状态化6 如何通过接口版本控制实现向后兼容7 可用性的保障手段-流量整形8 如何设计网关层限流和分布式限流9 EDA事件驱动…

STM32基础教程 p18 UART通信协议基础知识

1 UART通信协议简介 UART通信协议详细介绍 1.1 串行通信的简介 1. 单工通信&#xff1a;学校广播 2. 半双工通信&#xff1a;对讲机 3. 全双工通信&#xff1a;手机打电话 UART:通用的同步异步收发器 1.1.1 同步通信 组成&#xff1a;数据线、时钟线、偏选信号线 收发双方…

从文字到使用,一文读懂Kafka服务使用

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

大数据在互联网营销中的应用:案例与策略

互联网时代的营销领域正经历着一场由大数据驱动的变革。在2023年&#xff0c;大数据的应用已成为推动市场策略和决策的关键因素。本文将探讨大数据如何影响互联网营销&#xff0c;并通过实际案例分析展示其在提升营销效果方面的作用。 首先&#xff0c;通过分析海量数据&#x…