java数据结构与算法刷题-----LeetCode637. 二叉树的层平均值

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 广度优先
    • 2. 深度优先

在这里插入图片描述

解题思路:时间复杂度O(n),空间复杂度O(n)
  1. 使用广度优先遍历,按层遍历即可,遍历过程中,记录每层的结点和,最后将其平均数求出
  2. 使用深度优先遍历,需要记录当前结点的层次,然后必须使用一个可以通过下标获取值的容器来记录每个结点值

深度遍历时,将当前结点值累加到当前结点所在层次对应的地方,也就是容器对应下标(下标代表层次)位置。

1. 广度优先

代码:给出两种代码思路,一种是普通做法,第二种是直接在生成容器时,静态构建,因此第二种非常快,作为扩展了解即可
  1. 普通方法
    在这里插入图片描述
class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> list = new ArrayList<>();//答案
        Queue<TreeNode> bfs_queue = new LinkedList<>();//广度优先队列
        bfs_queue.offer(root);//根结点入队列
        while(!bfs_queue.isEmpty()){
            int size = bfs_queue.size();//获取当前层中结点个数
            long sum = 0;//记录当前层结点的和
            for(int i = 0;i<size;i++){//遍历当前层
                TreeNode poll = bfs_queue.poll();//出队列
                sum+=poll.val;//累加
                if(poll.left!=null) bfs_queue.offer(poll.left);
                if(poll.right!=null)bfs_queue.offer(poll.right);
            }
            list.add((double)sum/size);//计算平均值
        }
        return list;
    }
    
}
  1. 进阶方法
    在这里插入图片描述
import java.util.AbstractList;
class Solution {
    public static List<Double> averageOfLevels(TreeNode root) {
        return new AbstractList<Double>() {//直接构建抽象链表
            private final List<Double> list = new ArrayList<>();//此链表保存答案
            private final List<TreeNode> level = new ArrayList<>();//此链表用于深度优先遍历
            @Override
            public Double get(int index) {//此方法为重写链表构建方法,获取指定下标值
                init();//初始化链表
                return list.get(index);//获取值
            }
            @Override
            public int size() {//获取链表值
                init();
                return list.size();
            }
            void init() {//初始化链表
                if (list.isEmpty()) {//如果链表为空,就初始化
                    level.add(root);//广度优先初始化
                    while (!level.isEmpty()) {
                        levelTraverse(level);
                    }
                }
            }
            //广度优先逻辑,统计每层的平均值
            void levelTraverse(List<TreeNode> level) {
                int count = level.size();
                long sum = 0;
                for (int i = 0; i < count; i++) {
                    TreeNode tree = level.get(0);
                    sum += tree.val;
                    if (tree.left != null) {
                        level.add(tree.left);
                    }
                    if (tree.right != null) {
                        level.add(tree.right);
                    }
                    level.remove(0);
                }
                list.add((double) sum / count);
            }
        };
    }
}

2. 深度优先

代码

在这里插入图片描述

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);//对应层结点个数+1
        } else {//如果第一次到达当前层,创建层次,当前结点值为当前层第一个结点,当前层结点个数为1
            sums.add(1.0 * root.val);//
            counts.add(1);
        }
        //继续遍历
        dfs(root.left, level + 1, counts, sums);
        dfs(root.right, level + 1, counts, sums);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络基础(二)

目录 再谈"协议" 序列化 JSON 网络版计算器 HTTP协议 认识URL urlencode和urldecode HTTP协议格式 telnet指令 stat函数 struct stat类型 stringstream类型 wget指令 HTTP的方法 HTTP的状态码 传输层 再谈端口号 端口号范围划分 认识知名端口号(W…

深度学习_16_权重衰退调整过拟合

所谓过拟合即模型复杂度较高&#xff0c;但用于训练数据集过于简单&#xff0c;最后导致模型将过多无用渣质作为学习对象 这个在上篇 深度学习_15_过拟合&欠拟合 已经详细介绍&#xff0c;以下便不再赘述。 上篇提到要想解决过拟合现象可以试着降低模型复杂度&#xff0c…

Python web框架fastapi中间件与CORS详细教学

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Fastapi 景天的主页&#xff1a;景天科技苑 文章目录 fastapi中间件与CORS1、中间件1.创建中间件方法2.中间件里面添加响应头…

抖音视频评论批量采集软件|视频下载工具

《轻松搞定&#xff01;视频评论批量采集软件&#xff0c;助您高效工作》 在短视频这个充满活力和创意的平台上&#xff0c;了解用户评论是了解市场和观众心声的重要途径之一。为了帮助您快速获取大量视频评论数据&#xff0c;我们推出了一款操作便捷、功能强大的软件&#xff…

第一弹:Flutter安装和配置

目标&#xff1a; 1&#xff09;配置Flutter开发环境 2&#xff09;创建第一个Flutter Demo项目 Flutter中文开发者网站&#xff1a; https://flutter.cn/ 一、配置Flutter开发环境 Flutter开发环境已经提供集成IDE开发环境&#xff0c;因此需要配置开发环境的时候&#xf…

【STM32】STM32学习笔记-读写内部FLASH 读取芯片ID(49)

00. 目录 文章目录 00. 目录01. FLASH概述02. 读写内部FLASH接线图03. 读写内部FLASH相关API04. 读写内部FLASH程序示例05. 读写芯片ID接线图06. 读写芯片ID程序示例07. 程序示例下载08. 附录 01. FLASH概述 STM32F10xxx内嵌的闪存存储器可以用于在线编程(ICP)或在程序中编程(…

Spark中读parquet文件是怎么实现的

背景 最近在整理了一下 spark对Parquet的写文件的过程&#xff0c;也是为了更好的理解和调优Spark相关的任务&#xff0c; 因为对于Spark来说&#xff0c;任何一个事情都不是独立的存在的&#xff0c;比如说parquet文件的rowgroup设置的大小对读写的影响&#xff0c;以及parqu…

数据删除

目录 数据删除 删除员工编号为 7369 的员工信息 删除若干个数据 删除公司中工资最高的员工 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 数据删除 删除数据就是指删除不再需要的数据 delete from 表名称 [where 删…

Java架构之路-架构应全面了解的技术栈和工作域

有时候我在想这么简单简单的东西&#xff0c;怎么那么难以贯通。比如作为一个架构师可能涉及的不单单是技术架构&#xff0c;还包含了项目管理&#xff0c;一套完整的技术架构也就那么几个技术栈&#xff0c;只要花点心思&#xff0c;不断的往里面憨实&#xff0c;总会学的会&a…

huggingface学习|controlnet实战:云服务器使用StableDiffusionControlNetPipeline生成图像

ControlNet核心基础知识 文章目录 一、环境配置和安装需要使用的库二、准备数据及相关模型三、参照样例编写代码&#xff08;一&#xff09;导入相关库&#xff08;二&#xff09;准备数据&#xff08;以知名画作《戴珍珠耳环的少女》为例&#xff09;&#xff08;三&#xff0…

C++惯用法之RAII思想: 资源管理

C编程技巧专栏&#xff1a;http://t.csdnimg.cn/eolY7 目录 1.概述 2.RAII的应用 2.1.智能指针 2.2.文件句柄管理 2.3.互斥锁 3.注意事项 3.1.禁止复制 3.2.对底层资源使用引用计数法 3.3.复制底部资源(深拷贝)或者转移资源管理权(移动语义) 4.RAII的优势和挑战 5.总…

制造业数字化赋能:1核心2关键3层面4方向

随着科技的飞速发展&#xff0c;制造业正站在数字化转型的风口浪尖。数字化转型不仅关乎企业效率与利润&#xff0c;更决定了制造业在全球竞争中的地位。那么&#xff0c;在这场波澜壮阔的数字化浪潮中&#xff0c;制造业如何抓住机遇&#xff0c;乘风破浪&#xff1f;本文将从…

Maven终端命令生成Spring-boot项目并输出“helloworld“

1. 生成项目 mvn archetype:generate填写groupId和artifactId&#xff0c;其余默认即可 2. 修改pom.xml文件 将如下内容放入pom.xml文件内 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artif…

计网面试题整理上

1. 计算机网络的各层协议及作用&#xff1f; 计算机网络体系可以大致分为一下三种&#xff0c;OSI七层模型、TCP/IP四层模型和五层模型。 OSI七层模型&#xff1a;大而全&#xff0c;但是比较复杂、而且是先有了理论模型&#xff0c;没有实际应用。TCP/IP四层模型&#xff1a…

Git入门学习笔记

Git 是一个非常强大的分布式版本控制工具&#xff01; 在下载好Git之后&#xff0c;鼠标右击就可以显示 Git Bash 和 Git GUI&#xff0c;Git Bash 就像是在电脑上安装了一个小型的 Linux 系统&#xff01; 1. 打开 Git Bash 2. 设置用户信息&#xff08;这是非常重要的&…

使用GRU进行天气变化的时间序列预测

本文基于最适合入门的100个深度学习项目的学习记录&#xff0c;同时在Google clolab上面是实现&#xff0c;文末有资源连接 天气变化的时间序列的难点 天气变化的时间序列预测涉及到了一系列复杂的挑战&#xff0c;主要是因为天气系统的高度动态性和非线性特征。以下是几个主…

(十五)【Jmeter】取样器(Sampler)之HTTP请求

简述 操作路径如下: HTTP请求 (HTTP Sampler): 作用:模拟发送HTTP请求并获取响应。配置:设置URL、请求方法、请求参数等参数。使用场景:测试Web应用程序的HTTP接口性能。优点:支持多种HTTP方法和请求参数,适用于大多数Web应用程序测试。缺点:功能较为基础,对于复杂…

突发,Anthropic推出突破性Claude 3系列模型,性能超越GPT-4

&#x1f989; AI新闻 &#x1f680; 突发&#xff0c;Anthropic推出突破性Claude 3系列模型 摘要&#xff1a;人工智能创业公司Anthropic宣布推出其Claude 3系列大型语言模型&#xff0c;该系列包括Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus三个子模型&#xff0c;旨…

第18章 Java I/O系统

第18章 Java I/O系统 18.1 File类 File类不仅仅指文件&#xff0c;还能代表一个目录下的一组文件。 18.1.1 目录列表器 public class Test {public static void main(String[] args) {File file new File("E:\\test");String[] strings file.list(new DirFilte…

安装Proxmox VE虚拟机平台

PVE是专业的虚拟机平台&#xff0c;可以利用它安装操作系统&#xff0c;如&#xff1a;Win、Linux、Mac、群晖等。 1. 下载镜像 访问PVE官网&#xff0c;下载最新的PVE镜像。 https://www.proxmox.com/en/downloads 2. 下载balenaEtcher balenaEtcher用于将镜像文件&#…
最新文章