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

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安装方法&#xff08;以双语对照插件为例&#xff09;1、WebUI内置的下载方式&#xff08;推荐&#xff09;2、git clone安装&#xff08;更推荐&#xff09;3、github下载安装包后解压&#xff08;不推荐&#xff09; 强力推荐安装的几个插…...

HTML5表单的自动验证、取消验证、自定义错误信息

1、自动验证 通过在元素中使用属性的方法&#xff0c;该属性可以实现在表单提交时执行自动验证的功能。下面是关于对元素内输入内容进行限制的属性的指定。 属性说明required输入内容是否不为空pattern输入的内容是否符合指定格式min、max输入的数值是否在min~max范围step判断…...

SpringMVC系列九: 数据格式化与验证及国际化

SpringMVC 数据格式化基本介绍基本数据类型和字符串自动转换应用实例-页面演示方式Postman完成测试 特殊数据类型和字符串自动转换应用实例-页面演示方式Postman完成测试 验证及国际化概述应用实例代码实现注意事项和使用细节 注解的结合使用先看一个问题解决问题 数据类型转换…...

判断链表中是否有环(力扣141.环形链表)

这道题要用到快慢指针。 先解释一下什么是快慢指针。 快慢指针有两个指针&#xff0c;走得慢的是慢指针&#xff0c;走得快的是快指针。 在这道题&#xff0c;我们规定慢指针一次走一步&#xff0c;快指针一次走2步。 如果该链表有环&#xff0c;快慢指针最终会在环中相遇&a…...

Kubernetes基于helm部署jenkins

Kubernetes基于helm安装jenkins jenkins支持war包、docker镜像、系统安装包、helm安装等。在Kubernetes上使用Helm安装Jenkins可以简化安装和管理Jenkins的过程。同时借助Kubernetes&#xff0c;jenkins可以实现工作节点的动态调用伸缩&#xff0c;更好的提高资源利用率。通过…...

【Linux】vim详解

1.什么是vi/vim? 简单来说&#xff0c;vi是老式的文本编辑器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具&#xff0c;就连 vim的官方网站&#xff08; http://www.vim.org&#xff09;自己也说vim是一…...

Android11 mtk 第二次设置壁纸,锁屏壁纸不变的问题

1、情景:近日测试人员发现第一次更换壁纸后,主屏幕壁纸和锁屏壁纸均会改变;但第二次更换壁纸后,主屏幕壁纸会改变而锁屏壁纸不会改变。 2、要求:主屏幕壁纸和锁屏壁纸军改变 3、解决 路径:****\frameworks\base\services\core\java\com\android\server\wallpaper\Wallp…...

Java学习路线

目录 友情提醒第一章、Java基础1.1&#xff09;第一部分&#xff1a;Java 入门1.2&#xff09;第二部分&#xff1a;Java数组1.3&#xff09;第三部分&#xff1a;Java面向对象1.4&#xff09;第四部分&#xff1a;常用工具类1.5&#xff09;第五部分&#xff1a;集合体系1.6&a…...

java 实现人脸检测

1. 安装必要的库 确保你已经安装了JPEG库、BLAS和LAPACK库。在Ubuntu或Debian系统上&#xff0c;可以使用以下命令安装&#xff1a; sudo apt-get update sudo apt-get install libjpeg-dev libblas-dev liblapack-dev 在CentOS或Fedora系统上&#xff0c;可以使用以下命令安…...

VSCode神仙插件——Codeium (AI编程助手)

1、安装&登录插件 安装过程中会让你登录Codeium账户&#xff0c;可以通过Google账户登录&#xff0c;或者可以注册一个Codeium账户&#xff08;如果没有弹出让你登录账户的界面&#xff0c;可以等安装结束后在右下角找到登录的地方&#xff09; 右下角显示如下图所示&#…...

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控件

列表框是将一批文本字符串显示在一个具有滚动功能的方框中的控件。通过发送消息到列表框的窗口过程&#xff0c;程序可以添加或删除列表中的字符串。当列表框中的一个项目被选中时&#xff0c;列表框控件便发送 WM_COMMAND消息到其父窗口。然后父窗口确定哪个项目被选中。 本节…...

使用Node.js 框架( Express.js)来创建一个简单的 API 端点

文章目录 使用Node.js 框架&#xff08; Express.js&#xff09;来创建一个简单的 API 端点什么是express安装修改代码 express 自动刷新 使用Node.js 框架&#xff08; Express.js&#xff09;来创建一个简单的 API 端点 什么是express Express 是一个保持最小规模的灵活的 …...

企业服务行业CRM解决方案

企业服务行业CRM解决方案 强大的功能满足企业服务行业对客户管理、业务管理等方面的真实需求&#xff1b; 细分企业服务行业的不同领域&#xff0c;为不同业务场景提供个性化配置&#xff1b; 打通钉钉、企业微信等平台&#xff0c;降低企业使用CRM门槛&#xff0c;提供高性…...

服务器怎么进PE系统?

服务器进PE是指将服务器的操作系统切换到预安装环境&#xff08;Pre-Installation Environment&#xff09;的状态。在PE环境下&#xff0c;可以进行一些系统管理和故障排除的操作。在进入PE&#xff08;Preinstall Environment&#xff09;之前&#xff0c;首先需要确保你的服…...

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 应用程序中&#xff0c;三层架构&#xff08;Three-Tier Architecture&#xff09;是一种常见的设计模式&#xff0c;用于分离应用程序的表示层、业务逻辑层和数据访问层。这种架构有助于提高代码的可维护性、可扩展性和可重用性。以下是详细解释 Java 应用程序中使用 …...

打工人如何应对AI对工作岗位的风险

面对AI对工作岗位的潜在取代&#xff0c;我们可以从多个层面制定应对策略&#xff0c;以确保劳动力市场的平稳过渡和社会的可持续发展。以下是一些具体的应对策略&#xff1a; 一、加强教育与培训 提升STEM教育&#xff1a;增加科学、技术、工程和数学&#xff08;STEM&#…...

C++:从C语言过渡到C++

在这篇博客中&#xff0c;我将会介绍从C语言过渡到C的一些基础知识。 目录 C起源 C的关键字 输出hello&#xff0c;world ​编辑 命名空间 1.什么是命名空间 2.namespace的作用 3.域作用限定符 4.命名空间的使用 IO流 缺省参数 函数重载 引用 1.引用的定义 2.引…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...