37.哀家要长脑子了!--层序遍历
gongmi层序遍历模板
vector<vector<int>> levelOrder(TreeNode *root){queue<TreeNode*> que;vector<vector<int>> res;if(root != nullptr)que.push(root);while(!que.empty()){int size = que.size();vector<int> storey;for(int i = 0; i < size; i++){TreeNode *node = que.front();que.pop();storey.push_back(node->val);if(node->left) que.push(node->left);if(node->right) que.push(node->right);}res.push_back(storey);}return res;
}
这个模板可以打十个👊
用一个临时数字storey保存每一层的结点,用一个结果数组res保存总共的层,也就是最终的结果了。用队列que对每层的结点进行操作
大白话解说:当根节点不是空结点的时候,就把它放入队列中;当队列不为空的时候,有以下操作:新创一个数组storey,获取队列的大小,在队列大小中循环以下操作:(砖心砖心!!)获取队头结点node,将队头结点出队,将node的值放入数组storey中,然后把node的左右孩子先后加入队列中,结束队列循环的大小后就把所新建的数组storey放到返回的结果数组中。
可以想象成,这个数组stroey存储每一层的结点,这个队列呢就是用来获取每一层的结点以及这个结点的左右孩子。所以队列的大小就是每一层结点个数的多少。然后我们要对每一层的结点都进行这样的操作:取结点,出队,把它的元素存入,它的左右孩子也进入队列中等待操作。
1.102. 二叉树的层序遍历 - 力扣(LeetCode)

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;queue<TreeNode*> q;if(root != nullptr) q.push(root);while(!q.empty()){vector<int> tmp;int size = q.size();for(int i = 0; i < size; i++){TreeNode* node = q.front();q.pop();tmp.push_back(node->val);if(node->left) q.push(node->left);if(node->right) q.push(node->right);}res.push_back(tmp);}return res;}
};
2.107. 二叉树的层序遍历 II - 力扣(LeetCode)


class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {vector<vector<int>> res;queue<TreeNode*> que;if(root != nullptr)que.push(root);while(!que.empty()){vector<int> vec;int size = que.size();for(int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();vec.push_back(node->val);if(node->left) que.push(node->left);if(node->right) que.push(node->right);}res.push_back(vec);}reverse(res.begin(), res.end());return res;}
};
3.199. 二叉树的右视图 - 力扣(LeetCode)

这个挺有意思的,可能是因为我脑子缺根筋,只会走直线吧。。。。
右视图就是只能看到最右边的也就是每层的最后一个结点,那么我们就只要把最后一个结点给存入数组就好(i == size),而不是每一个。
错误思路:我本来想只将右结点进入队列,这是不对的,还是会把这个结点的不能看到得到左结点给存入结果数组,没有清楚题目的意思。我又想在这个基础上结点的右结点为空左结点不为空时才把这个结点入队。呃呃。不知道自己的脑子用什么做的。。。。。。。
本质!本质!!抓事情的本质!!!
class Solution {
public:vector<int> rightSideView(TreeNode* root) {queue<TreeNode*> que;vector<int> res;if(root != nullptr)que.push(root);while(!que.empty()){int size = que.size();for(int i = 0; i < size; i++){TreeNode *node = que.front();que.pop();if(i == size - 1) res.push_back(node->val);if(node->left) que.push(node->left);if(node->right) que.push(node->right);} }return res;}
};
3.637. 二叉树的层平均值 - 力扣(LeetCode)
就在每一层操作,也就是每一次的队列。
class Solution {
public:vector<double> averageOfLevels(TreeNode* root) {vector<double> res;queue<TreeNode*> que;if(root != nullptr) que.push(root);while(!que.empty()){double ave = 0;int size = que.size();for(int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();ave += node->val;if(node->left) que.push(node->left);if(node->right) que.push(node->right);}ave /= size;res.push_back(ave);}return res;}
};
4.429. N 叉树的层序遍历 - 力扣(LeetCode)

/*
// Definition for a Node.
class Node {
public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;}
};
*/
class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> res;queue<Node*> que;if(root != nullptr)que.push(root);while(!que.empty()){int size = que.size();vector<int> tmp;for(int i = 0; i < size; i++){Node*node = que.front();que.pop();tmp.push_back(node->val);int count = node->children[i].size();for(int j = 0; j < count; j++){if(node->children[j]) que.push(node->children[j]);}}res.push_back(tmp);} return res;}
};
要弄清楚数据结构,每个结点有两部分,一个是结点的元素值val,一个是Node结点数组children,children里面存储的也就是该结点的孩子,我们要遍历每个结点的孩子,就要把这么多的孩子在操作这个结点的时候,把孩子们入队
5.515. 在每个树行中找最大值 - 力扣(LeetCode)
就在每一层也就是每一次新队列的时候记录一下最大的呗
class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> res;queue<TreeNode*> que;if(root != nullptr)que.push(root);while(!que.empty()){int size = que.size();int max = 0;for(int i = 0; i < size; i++){TreeNode *node = que.front();que.pop();max = max > node->val ? max : node->val;if(node->left) que.push(node->left);if(node->right) que.push(node->right);} res.push_back(max); }return res;}
};
6.116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)

class Solution {
public:Node* connect(Node* root) {vector<vector<int>> res;queue<Node*> que; if(root != nullptr)que.push(root);while(!que.empty()){int size = que.size();Node *node1, *node2;for(int i = 0; i < size; i++){if(i == 0) {node1 = que.front();que.pop();node2 = node1;}else { node2 = que.front();que.pop();node1->next = node2;node1 = node1->next;}if(node2->left) que.push(node2->left);if(node2->right) que.push(node2->right);}node1->next = NULL;}return root;}
};
7.104. 二叉树的最大深度 - 力扣(LeetCode)
class Solution {
public:int maxDepth(TreeNode* root) {int res = 0;queue<TreeNode*> que;if(root != nullptr)que.push(root);while(!que.empty()){int size = que.size();res++;for(int i = 0; i < size; i++){TreeNode* node = que.front();que.pop();if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return res;}
};
要不就在每一层的时候记录一下深度,要不就套用层序遍历的模板然后返回它的结果数组大小
8.111. 二叉树的最小深度 - 力扣(LeetCode)
class Solution {
public:int minDepth(TreeNode* root) {int res = 0;queue<TreeNode*> que;if(root != nullptr)que.push(root);while(!que.empty()){int size = que.size();res++;for(int i = 0; i < size; i++){TreeNode *node = que.front();que.pop();if(!(node->left) && !(node->right)) return res;if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return res;}
};
遇到左右孩子都是空结点的立刻返回!!
9.226. 翻转二叉树 - 力扣(LeetCode)
class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(root == nullptr)return NULL;swap(root->left, root->right);invertTree(root->left);invertTree(root->right);return root;}
};
要按照先序遍历或者后序遍历,如果是中序遍历的话,下一个也要是继续反转左子树而不是右子树,因为这样的话,顺序才不会乱。
10.101. 对称二叉树 - 力扣(LeetCode)
class Solution {
public:bool compare(TreeNode *left, TreeNode *right){if(left != nullptr && right == nullptr) return false;else if(left == nullptr && right != nullptr) return false;else if(left == nullptr && right == nullptr) return true;else if(left->val != right->val) return true;bool out = compare(left->left, right->right);bool inner = compare(left->right, right->left);bool isSame = out && inner;return isSame;}bool isSymmetric(TreeNode* root) {if(root == nullptr)return NULL;return compare(root->left, root->right);}
};
这题还挺有意思的,但我是真的还没有跟递归产生共鸣。。。。
左边为空右边不为空,不对称;左边不为空右边为空,不对称;左右都为空,对称;排除存在空结点的情况后,左右的值不相等,不对称;这两个结点对称后,它俩的孩子结点也要对称,于是就递归调用这个方法,比较外侧的两个结点和内侧的两个结点。
相关文章:
37.哀家要长脑子了!--层序遍历
gongmi层序遍历模板 vector<vector<int>> levelOrder(TreeNode *root){queue<TreeNode*> que;vector<vector<int>> res;if(root ! nullptr)que.push(root);while(!que.empty()){int size que.size();vector<int> storey;for(int i 0; i …...
【从零开始AI绘画6】StableDiffusionWebUI拓展的安装方法以及推荐的几个拓展
这里写自定义目录标题 拓展Extention安装方法(以双语对照插件为例)1、WebUI内置的下载方式(推荐)2、git clone安装(更推荐)3、github下载安装包后解压(不推荐) 强力推荐安装的几个插…...
HTML5表单的自动验证、取消验证、自定义错误信息
1、自动验证 通过在元素中使用属性的方法,该属性可以实现在表单提交时执行自动验证的功能。下面是关于对元素内输入内容进行限制的属性的指定。 属性说明required输入内容是否不为空pattern输入的内容是否符合指定格式min、max输入的数值是否在min~max范围step判断…...
SpringMVC系列九: 数据格式化与验证及国际化
SpringMVC 数据格式化基本介绍基本数据类型和字符串自动转换应用实例-页面演示方式Postman完成测试 特殊数据类型和字符串自动转换应用实例-页面演示方式Postman完成测试 验证及国际化概述应用实例代码实现注意事项和使用细节 注解的结合使用先看一个问题解决问题 数据类型转换…...
判断链表中是否有环(力扣141.环形链表)
这道题要用到快慢指针。 先解释一下什么是快慢指针。 快慢指针有两个指针,走得慢的是慢指针,走得快的是快指针。 在这道题,我们规定慢指针一次走一步,快指针一次走2步。 如果该链表有环,快慢指针最终会在环中相遇&a…...
Kubernetes基于helm部署jenkins
Kubernetes基于helm安装jenkins jenkins支持war包、docker镜像、系统安装包、helm安装等。在Kubernetes上使用Helm安装Jenkins可以简化安装和管理Jenkins的过程。同时借助Kubernetes,jenkins可以实现工作节点的动态调用伸缩,更好的提高资源利用率。通过…...
【Linux】vim详解
1.什么是vi/vim? 简单来说,vi是老式的文本编辑器,不过功能已经很齐全了,但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具,就连 vim的官方网站( http://www.vim.org)自己也说vim是一…...
Android11 mtk 第二次设置壁纸,锁屏壁纸不变的问题
1、情景:近日测试人员发现第一次更换壁纸后,主屏幕壁纸和锁屏壁纸均会改变;但第二次更换壁纸后,主屏幕壁纸会改变而锁屏壁纸不会改变。 2、要求:主屏幕壁纸和锁屏壁纸军改变 3、解决 路径:****\frameworks\base\services\core\java\com\android\server\wallpaper\Wallp…...
Java学习路线
目录 友情提醒第一章、Java基础1.1)第一部分:Java 入门1.2)第二部分:Java数组1.3)第三部分:Java面向对象1.4)第四部分:常用工具类1.5)第五部分:集合体系1.6&a…...
java 实现人脸检测
1. 安装必要的库 确保你已经安装了JPEG库、BLAS和LAPACK库。在Ubuntu或Debian系统上,可以使用以下命令安装: sudo apt-get update sudo apt-get install libjpeg-dev libblas-dev liblapack-dev 在CentOS或Fedora系统上,可以使用以下命令安…...
VSCode神仙插件——Codeium (AI编程助手)
1、安装&登录插件 安装过程中会让你登录Codeium账户,可以通过Google账户登录,或者可以注册一个Codeium账户(如果没有弹出让你登录账户的界面,可以等安装结束后在右下角找到登录的地方) 右下角显示如下图所示&#…...
css文本划线效果(text-decoration相关属性详解)
/* 样式类型*/text-decoration: underline;/* 下划线颜色 */text-decoration-color: #ffcb15;/* 超出基线的字符不会被截断 */text-decoration-skip-ink: none;/*下划线厚度 */text-decoration-thickness: 5px;/* 与其原始位置的偏移距离 */text-underline-offset: 0;1. text-u…...
《Windows API每日一练》8.5 listbox控件
列表框是将一批文本字符串显示在一个具有滚动功能的方框中的控件。通过发送消息到列表框的窗口过程,程序可以添加或删除列表中的字符串。当列表框中的一个项目被选中时,列表框控件便发送 WM_COMMAND消息到其父窗口。然后父窗口确定哪个项目被选中。 本节…...
使用Node.js 框架( Express.js)来创建一个简单的 API 端点
文章目录 使用Node.js 框架( Express.js)来创建一个简单的 API 端点什么是express安装修改代码 express 自动刷新 使用Node.js 框架( Express.js)来创建一个简单的 API 端点 什么是express Express 是一个保持最小规模的灵活的 …...
企业服务行业CRM解决方案
企业服务行业CRM解决方案 强大的功能满足企业服务行业对客户管理、业务管理等方面的真实需求; 细分企业服务行业的不同领域,为不同业务场景提供个性化配置; 打通钉钉、企业微信等平台,降低企业使用CRM门槛,提供高性…...
服务器怎么进PE系统?
服务器进PE是指将服务器的操作系统切换到预安装环境(Pre-Installation Environment)的状态。在PE环境下,可以进行一些系统管理和故障排除的操作。在进入PE(Preinstall Environment)之前,首先需要确保你的服…...
Linux内核编译与调试menuos-linux-3.18.6-在ubuntu20.04环境
1 具体操作 下载 linux-3.18.6内核 wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz解压进入linux-3.18.6文件夹 tar -xvf linux-3.18.6.tar.xz cd linux-3.18.6/编译 #make x86_64_defconfig # 为x86_64生成配置 #make alldefconfig make i3…...
java-mysql 三层架构
在 Java 应用程序中,三层架构(Three-Tier Architecture)是一种常见的设计模式,用于分离应用程序的表示层、业务逻辑层和数据访问层。这种架构有助于提高代码的可维护性、可扩展性和可重用性。以下是详细解释 Java 应用程序中使用 …...
打工人如何应对AI对工作岗位的风险
面对AI对工作岗位的潜在取代,我们可以从多个层面制定应对策略,以确保劳动力市场的平稳过渡和社会的可持续发展。以下是一些具体的应对策略: 一、加强教育与培训 提升STEM教育:增加科学、技术、工程和数学(STEM&#…...
C++:从C语言过渡到C++
在这篇博客中,我将会介绍从C语言过渡到C的一些基础知识。 目录 C起源 C的关键字 输出hello,world 编辑 命名空间 1.什么是命名空间 2.namespace的作用 3.域作用限定符 4.命名空间的使用 IO流 缺省参数 函数重载 引用 1.引用的定义 2.引…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
