【刷爆力扣之637. 二叉树的层平均值】

637. 二叉树的层平均值

方法一:深度优先搜索dfs

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

遍历结束之后,第 i 层的平均值即为 sums[i]/counts[i]

class Solution {public List<Double> averageOfLevels(TreeNode root) {// 维护两个集合,一个集合counts记录每一层节点个数,一个集合sums记录每一层节点总和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;}// 如果当前层小于sums集合的长度,说明之前已经遍历过当前层的其他节点if (level < sums.size()) {sums.set(level, sums.get(level) + root.val);// 求和counts.set(level, counts.get(level) + 1); // 节点数加1} else { // 否则,说明第一次遍历当前层sums.add(1.0 * root.val); // 添加新的一层的元素counts.add(1); // count为1}// 左孩子dfs(root.left, level + 1, counts, sums);// 右孩子dfs(root.right, level + 1, counts, sums);}
}

方法二:广度优先搜索

也可以使用广度优先搜索计算二叉树的层平均值。从根节点开始搜索,每一轮遍历同一层的全部节点,计算该层的节点数以及该层的节点值之和,然后计算该层的平均值。

如何确保每一轮遍历的是同一层的全部节点呢?我们可以借鉴层次遍历的做法,广度优先搜索使用队列存储待访问节点,只要确保在每一轮遍历时,队列中的节点是同一层的全部节点即可。具体做法如下:

  • 初始时,将根节点加入队列;
  • 每一轮遍历时,将队列中的节点全部取出,计算这些节点的数量以及它们的节点值之和,并计算这些节点的平均值,然后将这些节点的全部非空子节点加入队列,重复上述操作直到队列为空,遍历结束。

由于初始时队列中只有根节点,满足队列中的节点是同一层的全部节点,每一轮遍历时都会将队列中的当前层节点全部取出,并将下一层的全部节点加入队列,因此可以确保每一轮遍历的是同一层的全部节点。

具体实现方面,可以在每一轮遍历之前获得队列中的节点数量 size,遍历时只遍历 size个节点,即可满足每一轮遍历的是同一层的全部节点。

public List<Double> averageOfLevels(TreeNode root) {List<Double> result = new ArrayList<>();// 层序遍历需要的队列数据结构Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {Double level = null;// 每一层节点个数int size = queue.size();// 每一层节点的总和Double sum = 0.0;// 每轮循环,将当前层的所有节点全部弹出,将下一层的所有节点全部入队for (int i = 0; i < size; i++) {TreeNode polled = queue.poll();sum += polled.val;TreeNode left = polled.left;TreeNode right = polled.right;if (left != null) {queue.offer(left);}if (right != null) {queue.offer(right);}}result.add(sum / size);}return result;
}

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

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

相关文章

Thinkphp--in-sqlinjection

一、漏洞原理 在 Builder 类的 parseData 方法中&#xff0c;由于程序没有对数据进行很好的过滤&#xff0c;将数据拼接进 SQL 语句&#xff0c;导致 SQL注入漏洞 的产生。 影响版本 5.0.13<ThinkPHP<5.0.15 5.1.0<ThinkPHP<5.1.5 在相应的文件夹位置打开终端…

RMQ从入门到精通

一.概述与安装 //RabbitMQ //1.核心部分-高级部分-集群部分 //2.什么是MQ 消息队列message queue 先入先出原则;消息通信服务 //3.MQ的大三功能 流量消峰 应用解耦 消息中间件 //&#xff08;1&#xff09;人-订单系统(1万次/S)—> 人 - MQ(流量消峰,对访问人员进行排队) -…

服务器数据恢复—服务器重装系统导致XFS分区丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器MD1200磁盘柜&#xff0c;通过raid卡将15块磁盘组建成一组raid5磁盘阵列。raid5阵列分配了2个lun&#xff0c;操作系统层面对lun进行分区&#xff1a;1个分区采用LVM扩容方式加入到了root_lv中&#xff0c;其余分区格式化为XFS文件系…

抽象方法的使用

抽象方法是Java中一种特殊的方法&#xff0c;它没有方法体&#xff0c;只有方法声明&#xff0c;通常用来定义一个方法的接口&#xff0c;具体的实现留给子类来完成。在Java中&#xff0c;使用抽象方法可以实现多态性&#xff0c;提高代码的灵活性和可扩展性。下面我将通过举例…

强化学习(Reinforcement learning)基本概念

概念&#xff1a; 强化学习是在与环境互动中为达到一个目标而进行的学习过程 三层结构&#xff1a; 基本元素&#xff1a;agent、environment、goal agent&#xff1a;可以理解为玩家&#xff0c;即某个游戏的参与方 environment&#xff1a;环境本身&#xff0c;可以理…

数据结构复习指导之串的模式匹配

文章目录 串的模式匹配 考纲内容 复习提示 1.简单的模式匹配算法 知识回顾 2.串的模式匹配算法——KMP算法 2.1字符串的前缀、后缀和部分匹配值 2.2KMP算法的原理是什么 3.KMP算法的进一步优化 串的模式匹配 考纲内容 字符串模式匹配 复习提示 本章是统考大纲第6章内…

Android开发知识杂录

1.XML解析问题 增加XML布局文件时候出现 mergeDebugResources 错误 解决方案 由于XML默认文件带有BOM&#xff0c;remove bom即可 2.开机启动界面添加 3.开机隐藏系统桌面 4.添加敲击传感器GPIO 1. 测试板子的GPIO引脚情况 echo in > /sys/class/gpio/gpio<gpio_number…

排序-八大排序FollowUp

FollowUp 1.插入排序 (1).直接插入排序 时间复杂度:最坏情况下:0(n^2) 最好情况下:0(n)当数据越有序 排序越快 适用于: 待排序序列 已经基本上趋于有序了! 空间复杂度:0(1) 稳定性:稳定的 public static void insertSort(int[] array){for (int i 1; i < array.length; i…

数据库学习之用户管理和权限问题

未完成 grant命令 grant命令用来管理权限&#xff0c;grant是集授权、创建用户、修改密码到等一系列权限于一身的一个命令。 语法 grant 权限列表 on 库名.表名 to 用户名客户端主机 [identified by 密码 with option参数]; 例子 任意数据库全部权限赋给123这个用户&…

计算机网络chapter1——家庭作业

文章目录 复习题1.1节&#xff08;1&#xff09; “主机”和“端系统”之间有何不同&#xff1f;列举几种不同类型的端系统。web服务器是一种端系统吗&#xff1f;&#xff08;2&#xff09;协议一词常用来用来描述外交关系&#xff0c;维基百科是如何描述外交关系的&#xff1…

mac虚拟机软件哪个好 mac虚拟机怎么安装Windows 苹果Mac电脑上受欢迎的主流虚拟机PK Parallels Desktop和VM

什么是苹果虚拟机&#xff1f; 苹果虚拟机是一种软件工具&#xff0c;它允许在非苹果硬件上运行苹果操作系统&#xff08;如ios&#xff09;。通过使用虚拟机&#xff0c;您可以在Windows PC或Linux上体验和使用苹果的操作系统&#xff0c;而无需购买苹果硬件。 如何使用苹果虚…

conda创建并激活环境

目录 conda创建并激活环境创建环境激活环境查看环境列表删除环境 参考资料 conda创建并激活环境 创建环境 conda create --name yourEnv python3.7–name&#xff1a;也可以缩写为 【-n】&#xff0c;【yourEnv】是新创建的虚拟环境的名字&#xff0c;创建完&#xff0c;可以…

【Python快速上手(九)】

目录 Python快速上手&#xff08;九&#xff09;Python3 推导式、命名空间Python3 推导式1. 列表推导式2. 字典推导式3. 集合推导式4. 生成器表达式注意事项 Python3 命名空间1. 内置命名空间&#xff08;Built-in Namespace&#xff09;2. 全局命名空间&#xff08;Global Nam…

CSDN如何在个人主页开启自定义模块|微信公众号

目前只有下面三种身份才具有这个功能。 VIP博客专家企业博客 栏目内容不知道怎么写HTML的&#xff0c;可以联系我帮你添加

Maven入门:1.简介与环境搭建

一.简介与环境搭建 1.Maven&#xff1a;用于自动化构建项目&#xff08;按照企业主流模板构建完善的项目结构&#xff09;和管理项目依赖&#xff08;依赖就是项目的jar包&#xff0c;通过配置的方式进行添加和管理&#xff0c;自动下载和导入&#xff09;的工具。即更加方便构…

【JDBC】数据库连接池

1 简介 1.1 概念 持有多个数据库连接的容器&#xff0c;当程序需要操作数据库的时候&#xff0c;直接可以从池中取出连接&#xff0c;使用完成之后&#xff0c;再放回到池中。 1.2 优点 节省资源。如果每次访问数据库&#xff0c;都需要创建新的连接&#xff0c;在使用完成后…

bbPress 中文汉化包,WordPress插件

汉化包下载地址&#xff1a;bbPress 中文汉化包.zip bbPress论坛插件 bbPress 是一款简单易用的 WordPress 论坛程序&#xff0c;由 WordPress 创建者开发&#xff0c;简单易用且完全可自定义。bbPress 可用于创建在线客户服务帮助渠道和交流平台。bbPress 是使用最多的WordP…

在IDEA中使用.env文件配置信息

在软件开发过程中&#xff0c;经常需要使用配置信息来指定应用程序的行为&#xff0c;例如数据库连接参数、API密钥等。而将这些敏感信息硬编码在代码中是不安全的&#xff0c;因此通常会将其存储在配置文件中。 .env文件是一种常见的配置文件格式&#xff0c;它可以存储键值对…

C 408—《数据结构》图、查找、排序专题考点(含解析)

目录 Δ前言 六、图 6.1 图的基本概念 6.2 图的存储及基本操作 6.3 图的遍历 6.4 图的应用 七、查找 7.2 顺序查找和折半查找 7.3 树型查找 7.4 B树和B树 7.5 散列表 八、排序 8.2 插入排序 8.3 交换排序 8.4 选择排序 8.5 归并排序和基数排序 8.6 各种内部排序算法的比较及…

Go语言nil概念,make与new的区别

nil 在Go语言中&#xff0c;nil 是一种特殊值&#xff0c;主要用于指针、接口、切片、映射、通道这五种引用类型。与其它类型的默认值&#xff08;零值&#xff09;有着显著的区别&#xff1a; nil&#xff1a; nil 表示没有具体的值或不存在的对象引用。它可以赋值给指针、切…