当前位置: 首页 > 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.引…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 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…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...