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,一经查实,立即删除!

相关文章

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

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

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…

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;用户怎么创建&…

教育与社会的发展

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

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

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

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.任…

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

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

PyTorch人脸检测

新书速览|PyTorch深度学习与企业级项目实战-CSDN博客 人脸检测解决的问题是确定一幅图上有没有人脸&#xff0c;而人脸识别解决的问题是这张脸是谁的。可以说人脸检测是人脸识别的前期工作。这里介绍Dlib库&#xff0c;它提供了Python接口&#xff0c;里面有人脸检测器&#x…

线程安全(二)synchronized 的底层实现原理、锁升级

目录 一、基础使用1.1 不加锁的代码实现1.2 加锁的代码实现二、实现原理2.1 synchronized 简介2.2 对象监控器(Monitor)2.3 加锁过程第一步:判断 Owner 指向第二步:进入 EntryList 阻塞第三步:主动进入 WaitSet 等待三、锁升级3.1 对象的内存结构3.2 Mark Word 对象头3.3 …

【安全设备】入侵检测

一、什么是入侵检测 入侵检测是一种网络安全技术&#xff0c;用于监测和识别对计算机系统或网络的恶意使用行为或未经授权的访问。入侵检测系统&#xff08;IDS&#xff09;是实现这一目标的技术手段&#xff0c;其主要目的是确保计算机系统的安全&#xff0c;通过及时发现并报…

蜂窝互联网接入:连接世界的无缝体验

通过Wi—Fi&#xff0c;人们可以方便地接入互联网&#xff0c;但无线局域网的覆盖范围通常只有10&#xff5e;100m。当我们携带笔记本电脑在外面四处移动时&#xff0c;并不是在所有地方都能找到可接入互联网的Wi—Fi热点&#xff0c;这时候蜂窝移动通信系统可以为我们提供广域…

hudi数据湖万字全方位教程+应用示例

1、时间轴&#xff08;TimeLine&#xff09; Hudi的核心是维护表上在不同的即时时间&#xff08;instants&#xff09;执行的所有操作的时间轴&#xff08;timeline&#xff09;&#xff0c;这有助于提供表的即时视图 一个instant由以下三个部分组成&#xff1a; 1&#xff09;…

Java高级重点知识点-25-Stream流、方法引用

文章目录 Stream流流式思想概述获取流常用方法 方法引用方法引用符通过对象名引用成员方法通过类名称引用静态方法通过super引用成员方法通过this引用成员方法类的构造器引用数组的构造器引用 Stream流 通过循环遍历来讲解流的优势&#xff1b; 要求&#xff1a;筛选所有姓张的…

实现Android夜间模式主题:从入门到精通

实现Android夜间模式主题:从入门到精通 随着用户对夜间模式的需求越来越高,Android开发者需要掌握如何在应用中实现夜间模式。本文将详细介绍在Android中实现夜间模式的步骤,包括配置、实现、以及一些最佳实践,帮助开发者创建更具吸引力和用户友好的应用。 夜间模式的优势…

Redis基础教程(二十):Java使用Redis

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

华贝甄选干细胞科技,揭秘生命修复的奥秘

在探索生命奥秘的漫漫征途中&#xff0c;华贝甄选凭借干细胞科技的神奇力量&#xff0c;为您点亮健康与活力的希望之光。 我们深知&#xff0c;细胞是生命的基石&#xff0c;而干细胞则是这基石中蕴含的无限潜能。华贝甄选精心打造的干细胞疗法&#xff0c;如同神奇的魔法&…