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

优质博文: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;教育研究、课堂教学…

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; …

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

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

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

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

硬件基础:差模和共模

一直以来&#xff0c;都难以理解差模和共模这两个概念&#xff0c;什么差分信号、差模信号、共模信号&#xff0c;差模干扰、共模干扰……虽然看了一些资料&#xff0c;但貌似说法还挺多的&#xff0c;理解起来仍然是一头雾水。所以&#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的认…

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…

NumSharp

github地址&#xff1a;https://github.com/SciSharp/NumSharp High Performance Computation for N-D Tensors in .NET, similar API to NumPy. NumSharp (NS) is a NumPy port to C# targetting .NET Standard. NumSharp is the fundamental package needed for scientific …

第二十一章——网络通信

一.网络程序设计基础 1.局域网与互联网 2.网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。 1.1 TCP/IP层次结构 2.TCP与UDP协议 TCP可保证数据从一端送至另一端时&#xff0c;能够确实送达&#xff0c;而且抵达的数据的排列顺序和送出时的顺序相…

设备间的指令通信

指令通信的概念 要进行设备和设备之间的交流就需要通过串口发送数据进行交流 而串口发送简单的数据只需要传输介质 但是要发送复杂的数据就需要介质和传输的规则了 三种应用场景 比如在上位机和mcu之间 通过上位机管理控制器 从而控制电池 单片机和单片机之间 用户输入数据到…

国产麒麟操作系统部署记录

前提&#xff1a;部署项目首先要安装各种软件&#xff0c;在内网环境下无法在线下载。 思路&#xff1a;首先部署一台能上网的系统&#xff0c;在此系统下只下载包&#xff0c;然后传到另一台内网系统下进行安装&#xff1b; 1、最开始yum未安装&#xff0c;因此需要先安装yu…

C语言中的动态内存管理

在C语言中&#xff0c;动态内存管理是通过一系列的标准库函数来实现的&#xff0c;这些函数包括malloc, free, calloc 和 realloc。它们允许程序在运行时动态地分配和释放内存&#xff0c;这是管理复杂数据结构&#xff08;如链表、树等&#xff09;时非常有用的功能。 为什么…