java算法day12

java算法day12

  • 199二叉树的右视图
  • 637二叉树的层平均值
  • 515 在每个树行中找最大值
  • 429 N叉树的层序遍历
  • 116 填充每个节点的下一个右侧节点指针

199 二叉树的右视图

这题还是层序遍历的板子,但是在处理上略有差异
请添加图片描述
这个题我一开始的想法就有误,因为我一开始是基于这个图去想了。以为只要光扩展每层最后一个节点就完事了。然而实际上是错误的。如果按照这种想法,当上面的图中,如果没有4这个节点,那么5这个节点是根本加不到结果集里面。所以这个思路不可取。

正确思路:
为了防止出现上面的情况,那就是左边也是可以扩展的,所以正确的处理是。每一层,每个节点都是需要扩展的,但是只有每层的最后一个元素要加入结果集。
最后一个元素要加入结果集怎么写?
每一层都用到了size,那么for循环的时候注意计数,到最后一个的时候进行结果收集就行了。

class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> result = new ArrayList<>();Deque<TreeNode> que = new ArrayDeque<>();if(root==null){return result;}que.offerLast(root);while(!que.isEmpty()){int size = que.size();for(int i = 0;i<size;i++){TreeNode temp = que.pollFirst();if(i==size-1){result.add(temp.val);}if(temp.left!=null){que.offerLast(temp.left);}if(temp.right!=null){que.offerLast(temp.right);}}}return result;}
}

637二叉树的层平均值

就是每层求个平均值。还是板子题

class Solution {public List<Double> averageOfLevels(TreeNode root) {List<Double> result = new ArrayList<>();Deque<TreeNode> que = new ArrayDeque<>();if(root==null){return result;}que.offerLast(root);while(!que.isEmpty()){int size = que.size();double sum = 0;double avg = 0;for(int i = 0;i<size;i++){TreeNode temp = que.pollFirst();sum += temp.val;if(temp.left!=null){que.offerLast(temp.left);}if(temp.right!=null){que.offerLast(temp.right);}}avg = sum/size;result.add(avg);}return result;}
}

515 在每个树行中找最大值

也是模板题,处理每一行的时候维护一个最大值即可。
唯一要记的就是int最小值是Integer.MIN_VALUE。

class Solution {public List<Integer> largestValues(TreeNode root) {List<Integer> result = new ArrayList<>();Deque<TreeNode> que = new ArrayDeque<>();if(root==null){return result;}que.offerLast(root);while(!que.isEmpty()){int size = que.size();int max = Integer.MIN_VALUE;for(int i = 0;i<size;i++){TreeNode temp = que.pollFirst();if(temp.val > max){max = temp.val;}if(temp.left!=null){que.offerLast(temp.left);}if(temp.right!=null){que.offerLast(temp.right);}}result.add(max);}return result;}
}

429 N叉树的层序遍历

就是改了一下扩展的方法,不是扩展左右子树了,而是直接把孩子列表加入栈中。
里面用到了一个方法是需要学习的。
ArrayDeque由于实现了Deque,而Deque继承了Queue接口,Queue又继承了Collection接口,所以他具有addAll方法。关于addAll的参数,他的参数类型是Collection类型,者意味着它可以接收任何实现了Collection接口的对象。这就包括了你能想到的单列结构。

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> result = new ArrayList<>();Deque<Node> que = new ArrayDeque<>();if(root == null){return result;}que.offerLast(root);while(!que.isEmpty()){int size = que.size();List<Integer> curList = new ArrayList<>();while(size>0){Node temp = que.pollFirst();curList.add(temp.val);//就是扩展方式变了,变为直接把子节点全部加入到队列中,这也等价于将里面的每个元素从尾部依次加入队列当中。que.addAll(temp.children);size--;}result.add(curList);}return result;}
}

116填充每个节点的下一个右侧节点指针

思路:与层序遍历的差别在于,在处理每一层的时候有变化。到每一层的时候,第一个节点需要单独的拿出来,当然拿出来后也要先进行扩展,因为还有下一层。然后就开始遍历该层剩余的节点。遍历主要还是靠当前que的size来实现的,由于该层第一个节点已经拿出去了,所以遍历的时候i从=1开始。在每个节点处理的过程中要做的就是修改指向。即首节点的next指向后面出栈的第二个节点,然后cur移动到next。并且这个过程中记得扩展左右子节点。

/*
// Definition for a Node.
class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, Node _left, Node _right, Node _next) {val = _val;left = _left;right = _right;next = _next;}
};
*/class Solution {public Node connect(Node root) {Deque<Node> que = new ArrayDeque<>();if(root==null){return root;}que.offerLast(root);while(!que.isEmpty()){//每层先取出第一个节点int size = que.size();Node cur = que.pollFirst();//扩展它if(cur.left!=null){que.offerLast(cur.left);}if(cur.right!=null){que.offerLast(cur.right);}for(int i = 1;i<size;i++){Node next = que.pollFirst();if(next.left!=null){que.offerLast(next.left);}if(next.right!=null){que.offerLast(next.right);}cur.next = next;cur = next;}}return root;}
}

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

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

相关文章

spring 中的路径匹配

在 spring 中&#xff0c;不管是注解使用时配置的基础包扫描路径&#xff0c;还是在 spring MVC 中根据路径匹配到具体的 handler&#xff0c;都会使用到路径匹配&#xff0c;今天我们来看下 spring 中的路径匹配到底是如何实现的。 glob pattern 语法 spring 借鉴了一种称之…

基于PID控制器的双容控制系统matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1PID控制器的基本原理 4.2双容水箱系统的数学模型 5.完整工程文件 1.课题概述 基于PID控制器的双容控制系统matlab仿真&#xff0c;仿真输出PID控制下的水位和流量两个指标。 2.系统仿真结果 &…

Jetpack Compose实现一个简单的微信UI

https://blog.csdn.net/News53231323/article/details/128509048 https://franzliszt1847.blog.csdn.net/article/details/129344822

Nginx七层(应用层)反向代理:SCGI代理scgi_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 SCGI代理scgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this art…

MATLAB——字符串处理

文章目录 MATLAB——字符串处理字符串处理函数字符串或字符串数组构造 MATLAB——字符串处理 字符串处理函数 MATLAB中的字符串处理函数如下&#xff1a; 函数名称说明eval(string)作为一个MATLAb命令求字符串的值blanks(n)返回一个具有n个空格的字符串deblank去掉字符串末尾…

Python进行数据分析:从基础到实践

数据分析是现代数据驱动决策的重要工具,Python以其强大的数据处理和分析库成为数据分析的首选编程语言。本文将介绍Python进行数据分析的基础知识、常用库以及一个完整的实战项目,帮助读者从基础入门到实际应用。 目录 数据分析概述Python中的数据分析库 NumPypandasMatplot…

ENSP防火墙

实验拓扑图 需求&#xff1a; ENSP的配置&#xff1a; 防火墙&#xff1a; 交换机&#xff1a; 华为防火墙的配置&#xff1a; 接口配置&#xff1a; 安全区域&#xff1a; 安全策略&#xff1a; 办公区访问DMZ&#xff1a; 生产区访问DMZ&#xff1a; 游客区只能访问门户网…

[人工智能]对未来建筑行业的影响

作者主页: 知孤云出岫 目录 引言1. 人工智能在建筑行业的应用场景1.1 设计阶段1.2 施工阶段1.3 运营和管理 2. 关键技术2.1 机器学习2.2 计算机视觉2.3 自然语言处理2.4 大数据分析 3. 实际案例分析3.1 案例1&#xff1a;利用GAN生成建筑设计方案3.2 案例2&#xff1a;利用计算…

操作User表的CRUD增删改查(二):修改和删除

文章目录 修改运行发现数据库数据没有添加进去 修改 int u session.update(s, new User(1,"xiaoxiao",18));运行发现数据库数据没有添加进去 运行发现数据库没有添加进去数据&#xff0c;原因是默认是手动添加的&#xff0c;需要修改。 有两种方法然后再重新运行&a…

如何ssh远程Windows电脑

参考&#xff1a;https://www.jianshu.com/p/1321b46b40ee 上述教程中&#xff0c;直接根据微软的教程进行openssh安装 遇到的问题 远程windows电脑需要具备什么条件&#xff1f; 需要Windows电脑上安装了openssh server 远程Windows电脑的话&#xff0c;用户怎么创建&…

图像分割评测指标,dice,voe,ASD,RVD(学习)

图像分割是计算机视觉领域中的一个核心任务&#xff0c;它涉及到识别并分离图像中的特定对象或区域。在研究和应用中&#xff0c;为了评估图像分割算法的性能&#xff0c;通常会使用一系列的评测指标。这些指标可以帮助我们量化分割结果与实际目标之间的差异&#xff0c;从而指…

[Linux][Shell][Shell函数]详细讲解

目录 1.创建函数2.执行函数3.给函数传入参数4.返回值5.函数中处理变量1.全局变量2.局部变量 1.创建函数 语法&#xff1a;关键字 或 C风格function name {commands }name() {commands }2.执行函数 执行Shell函数&#xff0c;直接写函数名即可&#xff0c;无需添加其他内容函…

构建Memcached帝国:分布式部署策略与实践指南

构建Memcached帝国&#xff1a;分布式部署策略与实践指南 Memcached作为一个高性能的分布式内存缓存系统&#xff0c;在面对大规模分布式部署时&#xff0c;需要考虑一系列的策略和最佳实践来确保系统的稳定性和效率。本文将深入探讨Memcached分布式部署的注意事项&#xff0c…

教育与社会的发展

生产力与教育的关系 政治经济制度与教育的关系 文化和人口与教育的关系

whereis命令是 Linux 和类 Unix 系统中的一个命令行工具,用于定位二进制程序、源代码和手册页(man pages)的位置

文章目录 1、whereis2、实例 1、whereis whereis 命令是 Linux 和类 Unix 系统中的一个命令行工具&#xff0c;用于定位二进制程序、源代码和手册页&#xff08;man pages&#xff09;的位置。当你想要快速找到某个程序或命令的安装位置时&#xff0c;whereis 命令会非常有用。…

跨数据中心复制:Memcached的高效数据同步策略

跨数据中心复制&#xff1a;Memcached的高效数据同步策略 在当今的云计算和大数据时代&#xff0c;跨数据中心的数据复制是确保数据高可用性和灾难恢复的关键技术。Memcached作为一个高性能的分布式内存缓存系统&#xff0c;虽然本身不提供跨数据中心复制的功能&#xff0c;但…

YOLOv10改进 | 添加注意力机制篇 | 添加LSKAttention大核注意力机制助力极限涨点

一、本文介绍 在这篇文章中&#xff0c;我们将讲解如何将LSKAttention大核注意力机制应用于YOLOv10&#xff0c;以实现显著的性能提升。首先&#xff0c;我们介绍LSKAttention机制的基本原理&#xff0c;它主要通过将深度卷积层的2D卷积核分解为水平和垂直1D卷积核&#xff0…

方便好用的C#.Net万能工具库Masuit.Tools

文章目录 简介开发环境安装使用特色功能示例代码1. 检验字符串是否是Email、手机号、URL、IP地址、身份证号等2.硬件监测(需要管理员权限&#xff0c;仅支持Windows&#xff0c;部分函数仅支持物理机模式)3.html的防XSS处理&#xff1a;4.整理Windows系统的内存&#xff1a;5.任…

Web应用安全扫描工具——Wfuzz

Web应用安全扫描工具——Wfuzz 简介 Wfuzz 是一个开源的 Web 应用程序模糊测试工具。它主要用于发现 Web 应用程序中的各种漏洞和隐藏资源。通过向目标发送大量不同的请求&#xff0c;识别出潜在的安全问题&#xff0c;如目录和文件暴露、参数注入、文件上传、认证绕过等。 …

如何搭建互联网医院系统源码?医疗陪诊APP开发实战详解

今天&#xff0c;小编将为大家讲解如何搭建一个完整的互联网医院系统源码&#xff0c;并介绍医疗陪诊APP的开发实战。 一、互联网医院系统的架构设计 搭建一个完整的互联网医院系统&#xff0c;需要从架构设计开始。一个典型的互联网医院系统通常包含以下几个核心模块&#xf…