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

每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历

每日一题系列(day 04)

前言:

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

   🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,日日累积,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️


  因为这两题具有很强的相似性,所以将两题放在一起。

一、LeetCode-107.二叉树的层序遍历 II

题目:

   给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例1:

在这里插入图片描述

示例2:

在这里插入图片描述

注意事项:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

思路:

  本题和昨天写的题很像,只不过这次的层序遍历是要从叶子结点所在层向上进行层序遍历,既然我们使用二维数组来进行层序遍历,我们不妨先将正常的层序遍历保存到二维数组中,在正常的层序遍历完成之后,将二维数组的元素(一维数组,存的是每一层节点的值)首尾交换。

  我们再来回顾一下昨天说的二叉树层序遍历深搜的过程。
  1、深搜需要传入参数root, 从哪层开始处理的层数,二维数组ans,在dfs中,首先判断当前节点是否为空,如果为空就return;
  2、不过当前节点不为空,接下来就判断当前层数是否是最新遍历到的层数,如果是,在本层数组里压入元素之前需要创建一个空一维数组尾插到二维数组ans中。
   3、接下来就是将当前处理节点压入到对应层数的一维数组中,这个节点处理完毕,深搜就要开始递归处理,先向左子孩子处理,下一层为本层节点+1,所以传参层数为k + 1,同理右子树也是如此,最后返回即可。
 &emsp:4、深搜完成之后,我们就得到了一个自顶向下的层序遍历结果,我们想让结果自底向上遍历,只需ans的一维数组进行首尾交换,最后返回即可。
在这里插入图片描述

代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void dfs(TreeNode *root, int k, vector<vector<int>> &ans)//深搜方式进行层序遍历{if(root == NULL) return;if(k == ans.size()) ans.push_back(vector<int>());ans[k].push_back(root -> val);dfs(root -> left, k + 1, ans);dfs(root -> right, k + 1, ans);return;}vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> ans;dfs(root, 0, ans);//先将正常的层序遍历拿到for(int i = 0, j = ans.size() - 1; i < j ; i++, j--)//翻转正常的层序遍历,达到想要的效果{swap(ans[i], ans[j]);}return ans;//最后返回数组即可}
};

一、LeetCode-103.二叉树的锯齿形层序遍历

题目:

   给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例1:

在这里插入图片描述

示例2:

在这里插入图片描述

思路:

  这题要求我们层序遍历要螺旋遍历,第一层从左到右遍历这一层节点,第二层从右到左遍历这层节点,第三层还是从左到右…遍历呈现出一种螺旋型遍历。
  其实我们和上面107题一样,只需要先用深搜将正常的层序遍历结果拿到,在处理这个层序遍历的结果,拿到了正常层序遍历结果,我们来观察:
在这里插入图片描述
  我们可以发现,我们遍历时需要翻转的总是偶数层,所以我们翻转的时候只需要处理偶数层的一维数组就可以了。

代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void dfs(TreeNode *root, int k, vector<vector<int>> &ans){if(root == NULL) return;if(k == ans.size()) ans.push_back(vector<int>());ans[k].push_back(root -> val);dfs(root -> left, k + 1, ans);dfs(root -> right, k + 1, ans);return;}vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>> ans;dfs(root, 0, ans);//深搜for(int k = 1 ; k < ans.size() ; k += 2)//偶数层才翻转{for(int i = 0, j = ans[k].size() - 1 ; i < j ; i++, j--)//将需要翻转的层进行翻转{swap(ans[k][i], ans[k][j]);}}return ans;//返回翻转后的数组即可}
};

  这两题的相似度很高,我这里都是使用深搜的方式得到正常层序遍历的结果,当然你可以使用队列的形式得到层序遍历结果,这里就不展示了,这两题的不用是对层序遍历的结果的处理,转换成另外的形式。

相关文章:

每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历

每日一题系列&#xff08;day 04&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…...

webpack配置自动压缩图片

手动压缩图片 图片压缩是很重要的前端优化&#xff0c;一般可以选择手动压缩 手动压缩网站 webpack压缩图片 这里记录借助webpack的image-webpack-loader实现自动压缩图片 项目是create-react-app搭建的&#xff0c;webpack5.64.4 1、安装相应loader npm i image-webpack…...

基于单片机预费电表控制系统(proteus仿真+源程序)

一、系统方案 1、本设计采用这51单片机作为主控器。 2、采集电量值送到液晶1602显示。 3、按键设置预设值&#xff0c;实际使用电量超过设置&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void LCD_init(void) { …...

【报错栏】(Vue) Invalid handler for event “click“: got undefined

Property or method "add" is not defined on the instance but referenced during render. 翻译&#xff1a; 属性或方法“add”未在实例上定义&#xff0c;但在渲染期间引用。 Invalid handler for event "click": got undefined 翻译&#xff1a; …...

单片机、ARM、嵌入式开发、Android 底层开发有什么关系?

单片机、ARM、嵌入式开发、Android 底层开发有什么关系&#xff1f; 从我目前的见识来看&#xff1a; 单片机是个系统&#xff08;比如&#xff1a;51、AVR、PLC...&#xff09;&#xff0c;其中包含了去除了输入输出之外的运算器、控制器、存储器&#xff0c;我们用程序可以非…...

Java中static、final、static final的区别

文章目录 finalstaticstatic final final final可以修饰&#xff1a;属性&#xff0c;方法&#xff0c;类&#xff0c;局部变量&#xff08;方法中的变量&#xff09; final修饰的属性的初始化可以在编译期&#xff0c;也可以在运行期&#xff0c;初始化后不能被改变。 final修…...

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《交直流配电网中柔性软开关接入的规划-运行协同优化方法》

这个标题涉及到交直流配电网中柔性软开关接入的规划-运行协同优化方法。下面是对这个标题各部分的详细解读&#xff1a; 交直流配电网&#xff1a; 这指的是一个电力系统&#xff0c;同时包含交流和直流电力传输的元素。这样的系统可能结合了传统的交流电力传输和近年来兴起的直…...

OSG文字-osgText3D(5)

osgText3D 三维立体文字比二维平面文字显示效果更好&#xff0c;相对二维平面文字&#xff0c;它有非常好的立体显示效果。 在实际虚拟现实项目中&#xff0c;过多使用三维立体文字会降低染效率&#xff0c;加重渲染负担&#xff0c;相对平面二维文字&#xff0c;它占用的内存是…...

ASN.1 编码规则概述(一)

文章目录 一、ASN.1二、 ASN.1的标准编码规则分类三、描述ASN.1记法的标准四、描述ASN.1编码规则的标准 一、ASN.1 ASN.1&#xff08;Abstract Syntax Notation One) 是一套标准&#xff0c;是描述数据的表示、编码、传输、解码的灵活的记法&#xff0c;它提供了一套正式、 无…...

STM32 中断系统

单片机学习 目录 文章目录 前言 一、中断系统 1.1 什么是中断 1.2 中断优先级 1.3 中断嵌套 1.4 C语言中的中断程序 二、STM32的中断通道和中断向量 2.1 中断通道 2.2 嵌套向量中断控制器NVIC 2.2.1 什么是NVIC 2.2.2 NVIC基本结构 2.2.3抢占优先级和响应优先级 2.2.4 NVIC的优…...

电磁场信息论及先进MIMO (黄大年茶思屋座谈) 笔记

天线阵的负载动态调控&#xff0c;动态阻抗匹配网络&#xff0c;实时跟着扫描角度的变化而变化&#xff0c;可能突破Hannan极限。 新的天线构架&#xff1a; 周期 —》非周期 每个单元不一样 动态可调&#xff0c;可重构 每个天线多端口或多模式 多层天线 非周期结构天线的增…...

Arm64版本的centos编译muduo库遇到的问题的归纳

环境&#xff1a;Mac m2 pro下的VMware虚拟机中Arm64 centos ./build.sh 执行后提示如下 cmake -DCMAKE_BUILD_TYPErelease -DCMAKE_INSTALL_PREFIX…/release-install-cpp11 -DCMAKE_EXPORT_COMPILE_COMMANDSON /root/package/muduo-master – Boost version: 1.69.0 – Co…...

leetcode:495. 提莫攻击

一、题目 链接&#xff1a;495. 提莫攻击 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;int findPoisonedDuration(int* timeSeries, int timeSeriesSize, int duration) 二、思路 遍历数组timeSeries&#xff0c;如果 元素值duration < 下一元素值 &#x…...

《微信小程序从入门到精通》---笔记1

小程序&#xff0c;我又来学习啦&#xff01;请多关照~ 项目驱动 小程序开发建议使用flex布局在小程序中&#xff0c;页面渲染和业务逻辑是分开的&#xff0c;分别运行在不同的线程中。Mini Program于2017年1月7号正式上线小程序的有点&#xff1a;跨平台、开发门槛低、开发周…...

Python---函数定义时缺省参数(参数默认值)---放最右边

缺省参数也叫默认参数&#xff0c;用于定义函数&#xff0c;为参数提供默认值&#xff0c;调用函数时 可 不传该默认参数的值&#xff08;注意&#xff1a;所有位置参数必须出现在默认参数前&#xff0c;包括函数定义和调用&#xff09;。 比如&#xff1a;原先的代码&#…...

深度学习之自监督模型汇总

1.BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding paper:https://arxiv.org/pdf/1810.04805v2.pdf code:GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT Abstract&#xff1a;我们引入了一种名为 BE…...

竞赛 : 题目:基于深度学习的水果识别 设计 开题 技术

1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/pos…...

oracle的debjob挂載及查詢

背景 有一個需求需要定時去執行一個produce&#xff0c;可以使用oracle的dbjob定時執行&#xff0c;相比較之前的vbs更加絲滑 --傳遞produce 開始的時間 頻率 declarea number;beginDBMS_JOB.SUBMIT(a,xx_warehouse_daliy_record_p;,to_date(202311230800,yyyymmddhh24mi),…...

Pycharm创建项目新环境,安装Pytorch

在python项目中&#xff0c;很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…...

assert断言

1.引入 assert.h 头⽂件定义了宏 assert() &#xff0c;⽤于在运⾏时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终⽌运⾏。这个宏常常被称为“断⾔”。 2.应用 assert(p ! NULL); 上⾯代码在程序运⾏到这⼀⾏语句时&#xff0c;验证变量 p 是否等于 …...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...