【题解】按之字形顺序打印二叉树
按之字形顺序打印二叉树
题目链接:按之字形顺序打印二叉树
解题思路:层次遍历,借助队列
首先解决如何模仿之字形的问题,我们为此设置一个flag,每到一层就修改flag,如果flag为true(初始为false的情况下),就逆序一下数组。
其次解决如何间隔每一层的问题,我们借助队列对实现,队列是先进先出的线性表,我们每一次让一层的节点进队列,在下一次循环中,让该层节点出队列,同时,让该层的子节点都进队列,这样,每次出队列的个数就是当前队列的大小,下一层要出队列的个数就等于这一层的子节点进队列的个数,也就是下一层的节点。由此,每层的节点数等于进入该层时队列长度,因为刚进入该层时,这一层每个节点都会push进队列,而上一层的节点都出去了。
具体做法:
首先进行判空,空树就返回空的res
其次建立辅助队列,同时初始化flag变量,根节点首先进入队列,作为第一次循环中的temp。
每进入一层,统计队列元素的个数,同时修改flag的值,每当访问一层,该层的子节点一定都加入队列,再下一层没加入,因此此时队列中的元素个数就是这一层的元素个数
遍历这一层这么多的节点数,出队,加入到该层的数组中,如果有子节点,就让每个节点的子节点进队
访问完该层元素后,根据flag的值决定该层对应的数组是否反转加入res中。
代码如下:
vector<vector<int> > Print(TreeNode* pRoot) {TreeNode* head = pRoot;vector<vector<int>> res;if(pRoot == nullptr) return res;queue<TreeNode*> temp;//辅助队列temp.push(head);//根节点先进队TreeNode* p;bool flag = true;//初始化flag标志位while (!temp.empty()) {//记录二叉树的某一行vector<int> row;int n = temp.size();flag = !flag;//每进入一列,更改标志位for(int i=0; i<n; ++i){p = temp.front();temp.pop();row.push_back(p->val);//有子节点进队,这样上一层出队,下一层进队,保证了队列大小就是下一层节点个数if(p->left) temp.push(p->left);if(p->right) temp.push(p->right);}if(flag) reverse(row.begin(), row.end());//反转数组,模仿之字形的遍历效果res.push_back(row);//将该层放入结果数组中} return res; }
解题思路2:借助栈
元素反转我们很容易想到栈,我们在此借助两个栈来实现之字形输出
首先栈1实现正序的层的元素输出,这样就要求我们在逆序输出的层中,先让右子树进栈,再让左子树进栈,反之,对于下一层需要逆序输出的,我们就先让左子树进栈,再让右子树进栈
具体步骤:
首先判空,空树返回空的res
建立两个辅助栈,根节点先进入栈1
当某个栈不空的时候,我们进入循环,在循环中,让下一层子树进入到相应的栈中,让该栈(该层)元素进入数组中,最后如果数组不空,就加入最后结果集中
根据访问的次序,栈1放入的是奇数层,也就是正常顺序输出的层,在该层中,让该层的子树按照先左后右的顺序加入栈2,这样在访问栈2的元素的时候就是按照逆序访问的,偶数层相反,在访问栈2时,将栈2中节点的子树按照先右后左的顺序加入栈1中,这样再访问栈1的时候,就是按照
先左再右的顺序访问了
每次访问完一层,即一个栈为空,则将一维数组加入二维数组中,并清空数组以便下一层用来记录,需要注意的是,将temp数组加入结果集res中一定要注意temp是否为空,因为存在一次外层循环,只有一个栈在其中放入元素的情况
代码如下:
vector<vector<int> > Print(TreeNode* pRoot) {TreeNode* head = pRoot;vector<vector<int>> res;if(head == nullptr) return res;stack<TreeNode*> s1;stack<TreeNode*> s2;s1.push(head);while(!s1.empty() || !s2.empty()){vector<int> temp;while(!s1.empty()){TreeNode* node = s1.top();temp.push_back(node->val);if(node->left) s2.push(node->left);if(node->right) s2.push(node->right);s1.pop();}if(temp.size()) res.push_back(temp);temp.clear();while(!s2.empty()){TreeNode* node = s2.top();temp.push_back(node->val);if(node->right) s1.push(node->right);if(node->left) s1.push(node->left);s2.pop();}if(temp.size()) res.push_back(temp);}return res;}
相关文章:
【题解】按之字形顺序打印二叉树
按之字形顺序打印二叉树 题目链接:按之字形顺序打印二叉树 解题思路:层次遍历,借助队列 首先解决如何模仿之字形的问题,我们为此设置一个flag,每到一层就修改flag,如果flag为true(初始为fals…...
后端人员如何快速上手vue
一、环境搭建 了解更多vue-cli 官网地址:https://cli.vuejs.org/zh/guide/browser-compatibility.html 前提 1.安装node(js代码的运行环境)、npm、cnpm/yarn; nodejs官网:https://nodejs.org/en cnpm安装:https://www.python100.com/htm…...
基于Prometheus监控Kubernetes集群
目录 一、环境准备 1.1、主机初始化配置 1.2、部署docker环境 二、部署kubernetes集群 2.1、组件介绍 2.2、配置阿里云yum源 2.3、安装kubelet kubeadm kubectl 2.4、配置init-config.yaml 2.5、安装master节点 2.6、安装node节点 2.7、安装flannel、cni 2.8、部署测…...
【数据分析】pandas (三)
基本功能 在这里,我们将讨论pandas数据结构中常见的许多基本功能 让我们创建一些示例对象: index pd.date_range(“1/1/2000”, periods8) s pd.Series(np.random.randn(5), index[“a”, “b”, “c”, “d”, “e”]). df pd.DataFrame(np.random.…...
nvm命令
1. 常见命令 1. nvm -v //查看nvm版本 nvm --version :显示 nvm 版本 2. nvm list //显示版本列表 nvm list :显示已安装的版本(同 nvm list installednvm list installed:显示已安装的版本nvm list available:显示所有…...
从此已是义无反顾
距离上次发这个专栏的文章已经过去了十多天,现在我已经开始准备面试内容,迟迟还没有投出第一份简历,只是因为我感觉对知识点的理解还不到位,于是开始一边看JavaGuide老师总结的面试题目,一边翻看以前学习的笔记&#x…...
Element组件浅尝辄止2:Card卡片组件
根据官方说法: 将信息聚合在卡片容器中展示。 1.啥时候使用?When? 既然是信息聚合的容器,那场景就好说了 新建页面时可以用来当做页面容器页面的某一部分,可以用来当做子容器 2.怎样使用?How? //Card …...
“深入剖析Java多态:点燃编程世界火花“
White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🙉 内容推荐:“继承与组合:代码复用的两种策略“🙉 🐹今日诗词:马踏祁连山河动,兵起玄黄奈何天🐹 快去学习 🌸思维导…...
golang官方限流器rate包实践
日常开发中,对于某些接口有请求频率的限制。比如登录的接口、发送短信的接口、秒杀商品的接口等等。 官方的golang.org/x/time/rate包中实现了令牌桶的算法。 封装限流器可以将ip、手机号这种的作为限流器组的标识。 接下来就是实例化限流器和获取令牌函数的实现…...
[windows]MAT- 下载及安装
1. 下载安装包 1.1MAT下载链接: https://pan.baidu.com/s/1sUWPITSto8MjOrcF0BsJQg?pwd1111 提取码:1111 1.2MAT需要jdk17版本及以上支持,下载链接: https://pan.baidu.com/s/111jz90S4tie_48lQeExcZg?pwd1111 提取码:1…...
数组模拟环形队列详解
数组模拟环形队列 实现逻辑 创建一个固定大小的数组作为队列的存储空间,同时定义队列的头部和尾部指针(front和rear)。初始时,将头部和尾部指针都设置为0,表示队列为空。入队操作(enqueue)&am…...
《论文阅读12》RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds
一、论文 研究领域:全监督3D语义分割(室内,室外RGB,kitti)论文:RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds CVPR 2020 牛津大学、中山大学、国防科技大学 论文链接论文gi…...
elementPlus使用el-icon
安装 # NPM $ npm install element-plus/icons-vue # Yarn $ yarn add element-plus/icons-vue # pnpm $ pnpm install element-plus/icons-vue一、main.ts(全局注册) import * as ElementIcons from element-plus/icons-vuefor (const key in Element…...
预测知识 | 神经网络、机器学习、深度学习
预测知识 | 预测技术流程及模型评价 目录 预测知识 | 预测技术流程及模型评价神经网络机器学习深度学习参考资料 神经网络 神经网络(neural network)是机器学习的一个重要分支,也是深度学习的核心算法。神经网络的名字和结构,源自…...
【Linux】进程的基本属性|父子进程关系
个人主页:🍝在肯德基吃麻辣烫 我的gitee:Linux仓库 个人专栏:Linux专栏 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处 文章目录 前言进程属性1.进程PID和PPID2.fork函数创建子进程1)为什…...
CCF考试:201809-1 卖菜(java代码)
目录 1、【问题描述】 2、【思路分析】 3、【代码区】 1、【问题描述】 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。 第一天,每个商店都自己定了一个价格。店主们希望自己的菜价和其他商店的一致…...
android wifi扫描 framework层修改扫描间隔
frameworks/opt/net/wifi/service/java/com/android/server/wifi/ScanRequestProxy.java 这个也就是说前台应用可以在120s(2分钟) 扫描 4 次 * a) Each foreground app can request a max of* {link #SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS} scan every* {l…...
webstorm debug调试vue项目
1.运行npm,然后控制台会打印下图中的地址,复制local的地址 2.run–>Edit Configuration,如下图 3.设置测试项 4.在你需要的js段打好断点 5.在上边框的工具栏里面有debug运行,点击debug运行的图标运行即可...
嵌入式linux的八股文之旅 DAY1
1 三次握手 四次挥手 服务端 先从close到listen 然后第一个syn报文 客户端 生成初始序列号 client_isn (就是iternal sequence number 初始序列号) 然后放到TCP首部的序列号端里 然后把SYN标志位置一 然后发送给服务器端 之后处于SYN-SENT状态 服务器…...
同创永益郑阳|与数智化共舞·业务稳定性保障新动力
2023年8月2日,由北大创新评论主办的2023 Inno China中国产业创新大会-保险产业创新论坛在京举办。本次论坛由同创永益、青牛软件、DaoCloud道客联合主办,INNO创新家、产业集群发展提供战略支持,未名数创承办,邀请到了学术专家、行…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
