当前位置: 首页 > news >正文

编程导航第六关——白银挑战

编程导航第六关——白银挑战

树的层次遍历

  • LeetCode102 题目要求:给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。
  • 思路:
    • 我们根据队列的特点,先进先出;要实现全部节点的层次遍历,再次我们采用队列的数据结构,当队列中元素为空时,则代表树已被遍历完成,所以我们在循环时的条件就是quene.size>0
    • 我们首先弹出元素,然后将该节点的子节点压入队列当中,这是,队列中的出队顺序就是层次遍历的顺序
    • 在本题中,我们需要实现每一层元素值的分别记录,所以需要得到每一层对应的节点数是多少;
    • 每一次的节点数就是队列的元素个数;只要出队,便是size-1,同时在出队时会将子节点压入队列中,当size==0时,那么这一层的元素已全部遍历完,同时此时队列中元素的个数,便是下一层的size
public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> result = new ArrayList<>();if (root == null) {return result;}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);//        遍历条件while (queue.size() > 0) {int size = queue.size();final ArrayList<Integer> temp = new ArrayList<>();for (int i = 0; i < size; i++) {TreeNode peek = queue.poll();temp.add(peek.val);if (peek.left != null) {queue.add(peek.left);}if (peek.right != null) {queue.add(peek.right);}}result.add(temp);}return result;}

层次遍历——自底向上

  • LeetCode 107.给定一个二叉树,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)。
  • 思路:
    • 本题的解题思路与上题基本类似,区别在于最后的结果列表需要倒序返回,可采用链表的结构,每次向结果集中添加元素时,添加在链表的首位
 public List<List<Integer>> levelOrderBottom(TreeNode root) {LinkedList<List<Integer>> result = new LinkedList<>();if (root == null) {return result;}Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.add(root);while (queue.size() > 0) {int size = queue.size();ArrayList<Integer> temp = new ArrayList<>();for (int i = 0; i < size; i++) {TreeNode poll = queue.poll();temp.add(poll.val);if (poll.left != null) {queue.add(poll.left);}if (poll.right != null) {queue.add(poll.right);}}result.addFirst(temp);}return result;}

层次遍历——锯齿形遍历

  • LeetCode103 题,要求是:给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
  • 思路:
    • 在实现层次遍历的基础上,对结果集中的列表选择元素的节点是在列表的末尾,还是列表的开头
    • 如果是奇数层,在首位
    • 如果是偶数层,在末尾
 public List<List<Integer>> zigzagLevelOrder(TreeNode root) {ArrayList<List<Integer>> result = new ArrayList<>();if (root == null) {return result;}LinkedList<TreeNode> queue = new LinkedList<>();int cen = 1;queue.add(root);while (queue.size() > 0) {int size = queue.size();LinkedList<Integer> temp = new LinkedList<>();for (int i = 0; i < size; i++) {TreeNode poll = queue.poll();if (cen % 2 == 0) {temp.addFirst(poll.val);}else {temp.add(poll.val);}if (poll.left != null) {queue.add(poll.left);}if (poll.right != null) {queue.add(poll.right);}}result.add(temp);cen++;}return result;}

N叉树的遍历

  • LeetCode429 给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
 public List<List<Integer>> levelOrder(Node root) {Queue<Node> nodes = new LinkedList<>();ArrayList<List<Integer>> result = new ArrayList<>();if (root == null) {return result;}nodes.add(root);while (nodes.size() > 0) {int size = nodes.size();ArrayList<Integer> temp = new ArrayList<>();for (int i = 0; i < size; i++) {final Node poll = nodes.poll();temp.add(poll.val);List<Node> children = poll.children;if (children != null) {for (int j = 0; j < children.size(); j++) {Node node = children.get(j);if (node != null) {nodes.add(node);}}}}result.add(temp);}return result;}

几个处理每层元素的题目

在每个树行中找最大值

  • LeetCode 515题目要求:给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
  • 思路:
    • 使用层次遍历,定义每一层的第一个是最大值,遍历每一层的节点,找出最大值
public List<Integer> largestValues(TreeNode root) {final ArrayList<Integer> result = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();if (root == null) {return result;}queue.add(root);while (queue.size() > 0) {int size = queue.size();int max=queue.peek().val;for (int i = 0; i < size; i++) {final TreeNode poll = queue.poll();if (poll.val>max){max=poll.val;}if (poll.left!=null){queue.add(poll.left);}if (poll.right!=null){queue.add(poll.right);}}result.add(max);}return result;}

在每个树行中找平均值

  • LeetCode 637 要求给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
  • 思路:同上
public List<Double> averageOfLevels(TreeNode root) {final ArrayList<Double> result = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();if (root == null) {return result;}queue.add(root);while (queue.size() > 0) {int size = queue.size();ArrayList<Integer> temp = new ArrayList<>();for (int i = 0; i < size; i++) {final TreeNode poll = queue.poll();temp.add(poll.val);if (poll.left != null) {queue.add(poll.left);}if (poll.right != null) {queue.add(poll.right);}}
//            计算平均值double sum = 0;for (int i = 0; i < temp.size(); i++) {sum += temp.get(i);}double average = sum / temp.size();result.add(average);}return result;}

二叉树的右视图

  • LeetCode 199题目要求是:给定一个二叉树的根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
  • 思路:
    • 本质上是取每层最后一个元素到结果集中,采取层次遍历的方法,具体思路同上
 public List<Integer> rightSideView(TreeNode root) {ArrayList<Integer> result = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();if (root == null) {return result;}queue.add(root);while (queue.size() > 0) {int size = queue.size();for (int i = 0; i < size; i++) {TreeNode node = queue.poll();if (node.left != null) {queue.add(node.left);}if (node.right != null) {queue.add(node.right);}if (i == size - 1) {result.add(node.val);}}}return result;}

最底层 最左边

  • Offer II 045.给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
  • 思路:
    • 层次遍历最后一个输出的元素是最右边,最底部;
    • 要获取最左边,最底部,翻转每次元素节点,实现每层从右往左遍历
    • 返回值的条件便是,当最后一个节点弹出时(队列为空时)返回该节点的值
public int findBottomLeftValue(TreeNode root) {
//        ArrayList<Integer> result = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();if (root == null) {return 0;}queue.add(root);while (queue.size() > 0) {int size = queue.size();for (int i = 0; i < size; i++) {TreeNode node = queue.poll();if (node.right != null) {queue.add(node.right);}if (node.left != null) {queue.add(node.left);}if (queue.size() == 0) {return node.val;}}}return 0;}

相关文章:

编程导航第六关——白银挑战

编程导航第六关——白银挑战 树的层次遍历 LeetCode102 题目要求&#xff1a;给你一个二叉树&#xff0c;请你返回其按层序遍历得到的节点值。(即逐层地&#xff0c;从左到右访问所有节点)。思路&#xff1a; 我们根据队列的特点&#xff0c;先进先出&#xff1b;要实现全部节…...

743. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…...

Kubernetes高可用集群二进制部署(四)部署kubectl和kube-controller-manager、kube-scheduler

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…...

在CSDN学Golang场景化解决方案(微服务架构设计)

一&#xff0c;聚合器微服务设计模式 在Golang微服务架构设计中&#xff0c;聚合器&#xff08;Aggregator&#xff09;微服务设计模式是一种常见的应用程序体系结构模式。该模式旨在简化客户端与后端微服务之间的通信&#xff0c;并支持更高级别的操作&#xff0c;例如聚合多…...

centos7 yum安装mysql5.7

卸载mysql 以下指令查看是否安装过 rpm -qa | grep -i mysql 如果发现已经安装&#xff0c;需要卸载了再安装&#xff08;据说&#xff0c;这样的卸载是不彻底的。&#xff09; rpm -e mysql 卸载 mariadb yum -y remove mariadb-libs-1:5.5.68-1.el7.x86_64 下载和安装mys…...

安防视频汇聚平台EasyCVR视频广场面包屑侧边栏支持拖拽操作

智能视频监控平台EasyCVR能在复杂的网络环境中&#xff0c;将海量设备实现集中统一接入与汇聚管理&#xff0c;实现视频的处理与分发、录像与存储、按需调阅、平台级联等。 TSINGSEE青犀视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协…...

爬虫007_python中的输出以及格式化输出_以及输入---python工作笔记025

首先看输出 输出这里,注意不能直接上面这样,18需要转换成字符串 可以看到python中这个字符串和数字一起的时候,数字要转换一下成字符串. 然后这里要注意%s 和%d,这个s指的是字符串,d指的是数字 注意后面的内容前面要放个% ,然后多个参数的话,那么这里用(),里面用,号隔开 然…...

485modbus转profinet网关连三菱变频器modbus通讯触摸屏监控

本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式&#xff0c;使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关&#xff0c;用户可以有效地管理和监控设备&#xff0c;从…...

话费充值接口文档

话费充值接口文档 接口版本&#xff1a;1.0 ―、引言 文档概述 本文档提供话费充值接口规范说明&#xff0c;提供一整套的完整的接入示例(http 接口)供商户参 考&#xff0c;可以帮助商户开发人员快速完成接口开发与联调&#xff0c;实现与话费充值系统的交易互联。 公司官网…...

windows系统的IP、路由、网关、内外网同时访问路由以及修改系统文件hosts的配置

当我们刚刚入职一家公司的时候、一般公司会给我下发一个ip地址和mac地址、还有访问一些公司的平台需要修改hosts之后的路由配置、以及第一次配置内网、如何内外网同时上网。 目录 一、ip的配置 1.1、IP的配置 1.2、mac地址的配置 1.3、内外网路由的配置&#xff08;w11系统需…...

Kubespray-offline v2.21.0-1 下载 Kubespray v2.22.1 离线部署 kubernetes v1.25.6

文章目录 1. 目标2. 预备条件3. vcenter 创建虚拟机4. 系统初始化4.1 配置网卡4.2 配置主机名4.3 内核参数 5. 打快照6. 安装 git7. 配置科学8. 安装 docker9. 下载介质9.1 下载安装 docker 介质9.2 下载 kubespray-offline-ansible 介质9.3 下载 kubernetes 介质 10. 搬运介质…...

代码随想录训练营Day59单调栈Part01|739. 每日温度|496.下一个更大元素①

单调栈 单调栈应用场景&#xff1a;找当前元素左边/右边比当前元素大/小的第一个元素什么是单调栈&#xff1a;保证栈里面的元素递增/递减&#xff08;需要自己定义&#xff09;栈内保存什么&#xff1a;存入下标如何比较大小&#xff1a;栈和数组做映射递增&#xff1f;递减&…...

RPMsg-Lite上手

文章目录 1、rpmsg-lite介绍2、rpmsg-lite 应用 现在的芯片非常复杂&#xff0c;很多都是包含多个核&#xff0c;特别是片上系统&#xff08;SoC&#xff09;&#xff0c;一颗芯片上不仅包含了很多个核心&#xff0c;并且很多核心都是异构的。 为了最大限度的发挥他们的性能&am…...

基于YOLOv8 的 多边形区域内目标检测,跟踪,计数

文章大纲 使用OpenCV 进行多边形 角点获取yolov5 的样例实现基于 roboflow 开源库的实现roboflow 开源库 介绍基于YOLOv8 track 的 Polygon Zone 计数参考文献与学习路径自己实现使用 开源库使用OpenCV 进行多边形 角点获取 import cv2 def SetPoints(windowname, img):"…...

STSP中用于记录节点和旅行回路的四种数据结构

STSP中用于记录节点和旅行回路的四种数据结构 双链表结构2-level tree卫星结构k-level卫星结构树参考文献 对于TSP是是历史悠久的研究问题&#xff0c;直至现在已经有了很多成熟高效的算法来求解问题。在拥有好的求解算法的同时&#xff0c;优秀的数据结构可以同时大幅提升问题…...

【Spring】AOP切点表达式

文章目录 1、语法2、通配符3、execution4、within5、annotation6、args7、args8、bean9、this10、target11、target12、within13、表达式组合14、补充 1、语法 动作关键词(访问修饰符 返回值 包名.类/接口名 .方法名(参数)异常名) 举例&#xff1a; execution(public User c…...

设计模式再探——代理模式

目录 一、背景介绍二、思路&方案三、过程1.代理模式简介2.代理模式的类图3.代理模式代码4.代理模式还可以优化的地方5.代理模式的项目实战&#xff0c;优化后(只加了泛型方式&#xff0c;使用CGLIB的代理) 四、总结五、升华 一、背景介绍 最近在做产品过程中对于日志的统一…...

MySQL日志——查询日志

1.查询日志 show variables like %general%;修改mysql的配置文件 /etc/my.cnf文件&#xff0c;添加如下内容&#xff1a; #该选项用来开启查询日志&#xff0c;可选值&#xff1a;0或者1&#xff1b;0代表关闭&#xff0c;1代表开启 general_log1 #设置日志的文件名&#xff0…...

Java版本工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...

pytorch的CrossEntropyLoss交叉熵损失函数默认是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的&#xff0c;即多个样本输入后获取的是一个均值标量&#xff0c;而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...