二叉树题目:二叉树的层平均值

news2024/12/26 14:28:04

文章目录

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

题目

标题和出处

标题:二叉树的层平均值

出处:637. 二叉树的层平均值

难度

4 级

题目描述

要求

给定一个二叉树的根结点 root \texttt{root} root,以数组的形式返回每一层结点的平均值。与实际答案相差 10 -5 \texttt{10}^\texttt{-5} 10-5 以内的答案视为正确。

示例

示例 1:

示例 1

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

示例 2:

示例 2

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

数据范围

  • 树中结点数目在范围 [1,   10 4 ] \texttt{[1, 10}^\texttt{4}\texttt{]} [1, 104]
  • -2 31 ≤ Node.val ≤ 2 31 − 1 \texttt{-2}^\texttt{31} \le \texttt{Node.val} \le \texttt{2}^\texttt{31} - \texttt{1} -231Node.val2311

解法一

思路和算法

只要得到二叉树每一层的结点值总和与结点数,即可得到每一层结点的平均值。可以使用层序遍历实现。

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

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

代码

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> averages = new ArrayList<Double>();
        Queue<TreeNode> queue = new ArrayDeque<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;
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            averages.add(sum / size);
        }
        return averages;
    }
}

复杂度分析

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

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

解法二

思路和算法

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

遍历结束之后得到二叉树每一层的结点值总和与结点数,此时即可计算每一层结点的平均值。

代码

class Solution {
    List<Double> sums = new ArrayList<Double>();
    List<Integer> counts = new ArrayList<Integer>();

    public List<Double> averageOfLevels(TreeNode root) {
        dfs(root, 0);
        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 node, int level) {
        if (level < sums.size()) {
            sums.set(level, sums.get(level) + node.val);
            counts.set(level, counts.get(level) + 1);
        } else {
            sums.add(1.0 * node.val);
            counts.add(1);
        }
        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/999978.html

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

相关文章

新人白嫖:基于揽睿星舟云部署Stable Diffusion,10 分钟体验 SDXL 1.0 超强功能(AI绘画保姆级教程)

一、前言 SDXL 1.0 自推出到现在&#xff0c;已经有一段时间了&#xff0c;网上也看到了用 SDXL 做出的各种惊艳的图&#xff0c;相对于 Stable Diffusion 之前的版本来说&#xff0c;功能确实强大了很多。 SDXL 1.0 给我们带来最大的好处就是&#xff0c;基本可以实现靠嘴出图…

Openlayers 教程 - feature(图形要素)三种悬浮事件(移入移出)以及适用范围

Openlayers 教程 - feature&#xff08;图形要素&#xff09;两种悬浮事件以及使用范围 核心代码完整代码&#xff1a;在线示例 之前介绍了 Openlayers 的点击事件&#xff0c;这次介绍一下悬浮事件。 悬浮事件和点击事件还是有区别的&#xff1a;一般点击事件是一次事件&…

element plus表格合并行

/*** 合并相同数据&#xff0c;导出合并列所需的方法(只适合el-table)*/ export function getRowSpanMethod(data, rowSpanArray) {/*** 要合并列的数据*/const rowSpanNumObject {};//初始化 rowSpanNumObjectrowSpanArray.map((item) > {rowSpanNumObject[item] new Arr…

Informatica使用操作流程--聚合、表达式转换、查找、排序组件的使用 案例3

一、需求&#xff1a; 将oracle数据库的scott用户源表items 直抽至 EDW层 EDW_items。数据存储到oracle的edw01用户下 数据抽取至EDW层做聚合转换 求各供应商 min(price),avg(price),max(price),sum(price), 2*avg(price) 根据供应商id去供应商表查找供应商名称 查验…

【Java核心知识】idea项目编译错误排查思路

文章目录 idea项目编译错误排查思路一个项目是如何运行的项目编译报错时排查常见思路 idea项目编译错误排查思路 一个项目是如何运行的 在开始之前&#xff0c;我们需要知道idea对一个项目是如何维护和运行的&#xff1f;idea会把用户自定义配置放在.idea文件夹中&#xff0c…

LeetCode:2. 两数之和

这个解题思路来自代码随想录&#xff1a;代码随想录 (programmercarl.com) class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {std::unordered_map <int,int> map;for(int i 0; i < nums.size(); i) {// 遍历当前元素&am…

ME21N 采购订单屏幕增强

1、业务需求 采购订单行项目新增“图号”和“价格类型”字段。其中图号只查询底表展示&#xff0c;不做修改&#xff1b;价格类型做下拉框&#xff1b; 2、增强实现 增强标准表EKPO结构CI_EKPODB。抬头增加字段则修改EKKO结构CI_EKKODB 增强点CMOD&#xff1a;MM06E005 出口…

Redis7--基础篇1(概述,安装、卸载及配置)

1. Redis概述 1.1 什么是Redis Redis&#xff1a;REmote Dictionary Server&#xff08;远程字典服务器&#xff09; Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数…

运营岗位需要一个内部知识库吗?

在运营岗位中&#xff0c;一个内部知识库是非常有价值的。运营岗位涉及到许多不同的任务和责任&#xff0c;需要掌握大量的专业知识和最佳实践。一个内部知识库可以帮助运营团队更好地管理和共享这些知识&#xff0c;提高工作效率和质量。 内部知识库对运营岗位的价值和应用场…

Eclipse安装FTP连接工具

查看Eclipse版本 Eclipse 安装串口终端工具_哭哭啼的博客-CSDN博客 安装 选择您的版本的插件发布站点&#xff1a; 在过滤器字段中,键入"remote".选择Mobile and Device Development&#xff0c;并选择 点击"下一步",然后接受条款.它现在应该下载并安装.…

SAP物料主数据归档详解(物理删除)

平时在操作系统过程中经常会不小心创建出很多无用的物料主数据&#xff0c;但是系统只能通过MM06打上删除标记&#xff0c;但是物料最终在系统中还是可以查询到的。 相信各位大顾问们肯定被用户问过&#xff0c;有没有办法把物料或者是业务数据从物理上删除。顾问们的回答肯定…

【算法】Java-使用数组模拟单向链表,双向链表

目录 试题1&#xff1a;实现一个单链表&#xff0c;并实现以下功能&#xff1a; 试题2&#xff1a;实现一个双链表&#xff0c;并实现以下功能 思路总结&#xff1a; 什么情况下可能涉及到用数组实现链表呢&#xff1f; 在学习时了解到了可以用数组模拟链表&#xff0c;使其…

【LInux编译器gcc/g++】gcc使用方法和动静态库相关概念

目录 一.前言 二.源代码的翻译环境 三.gcc相关指令 四.动静态库 1.什么是库&#xff1f; 2.库的命名 3.库的链接方式 4.动静态链接的优缺点 5.小结 一.前言 在Windows系统上我们常用VisualStudio来进行C/C开发&#xff0c;VS并不是一款单一的软件&#xff0c;而是集成…

UI设计模式是什么?有哪些常用的?

UI设计模式是针对常见的用户界面问题提出的解决方案。当解决方案得到验证时&#xff0c;它经常被使用&#xff0c;最终演变成可重复使用的设计模式。 设计师可以根据不同的网站功能类型选择使用相应的网站UI设计模式&#xff0c;从而创建一致高效的网站UI界面。 本文推荐8种常…

选择排序——直接选择排序

直接选择排序&#xff1a;&#xff08;以重复选择的思想为基础进行排序&#xff09; 1、简述 顾名思义就是选出一个数&#xff0c;再去抉择放哪里去。 设记录R1&#xff0c;R2…&#xff0c;Rn&#xff0c;对i1&#xff0c;2&#xff0c;…&#xff0c;n-1&#xff0c;重复下…

【MMDetection】bug记录

bug1&#xff1a; if env_cfg.get(cudnn_benchmark): AttributeError: NoneType object has no attribute get 解决办法&#xff1a; 配置文件缺少了env_cfg信息&#xff0c;需要在config文件中添加&#xff0c;如以下内容&#xff1a; env_cfg dict(cudnn_benchmarkFalse…

Java 使用 EMQX 实现物联网 MQTT 通信

一、介绍 1、MQTT MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议)&#xff0c;是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在1999年发布。MQTT最大优点在于&#xff…

Netty核心原理:一、基础入门-01:初入JavaIO之门BIO、NIO、AIO实战练习

文章目录 一、前言介绍1.1 BIO&#xff1a;同步阻塞I/O模式1.2 NIO&#xff1a;同步非阻塞I/O模式1.3 AIO&#xff1a;异步非阻塞I/O模式 二、代码实现2.1 工程结构2.2 BIO&#xff1a;同步阻塞I/O实现2.2.1 BIO处理器2.2.2 BIO适配器2.2.3 BIO客户端处理器2.2.4 BIO客户端2.2.…

计算机网络第五章——传输层(上)

早知如此绊人心&#xff0c;何如当初莫相识 文章目录 前言 前言 虽然说是手机和手机之间的通信但是其实是手机之间的进程和进程之间的通信&#xff0c;所以这一章主要是研究进程之间通信的问题&#xff0c;在计算机网络中有一个重要的问题&#xff0c;在进行数据通信和资源共享…

【分享】golang windows 运行报错 undefined: syscall.SIGUSR1

在跟着煎鱼大佬学习 Golang-gin的时候&#xff0c;"在优雅的重启服务篇" ,为了gin服务的热更新&#xff0c;采用了 endlessfresh的方案&#xff0c;安装endless后无法在windows本地调试,然后报错。 (优雅的重启服务-地鼠文档优雅的重启服务-我不怎么喜欢左写写&#…