算法训练营第十八天 | LeetCode 102 二叉树的层序遍历、LeetCode 226 翻转二叉树、LeetCode 101 对称二叉树

LeetCode 102 二叉树的层序遍历

这题用的队列和指针遍历法。难点在于记录每层末尾位置,这就要用到两个指针,一个end指针记录末尾节点,一个endchild跟着遍历该层内子节点位置,记录下一层末尾节点位置,方便在该层节点遍历结束后将其值赋给end指针进行下一层遍历。

代码如下:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if (!root) return res;queue<TreeNode*> myque;myque.push(root);TreeNode* end = root;TreeNode* endchild = root;while (!myque.empty()) {vector<int> level;TreeNode* cur = myque.front();while (cur != end) {level.push_back(cur->val);if (cur->left) {myque.push(cur->left);endchild = cur->left;}if (cur->right) {myque.push(cur->right);endchild = cur->right;}myque.pop();cur = myque.front();}level.push_back(cur->val);res.push_back(level);if (cur->left) {myque.push(cur->left);endchild = cur->left;}if (cur->right) {myque.push(cur->right);endchild = cur->right;}end = endchild;myque.pop();}return res;}
};

但是中午发现我好像忘了队列自带的size函数了。修改后如下:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;if (!root) return res;queue<TreeNode*> myque;myque.push(root);while (!myque.empty()) {vector<int> level;int num = myque.size();while (num--) {TreeNode* cur = myque.front();level.push_back(cur->val);if (cur->left) {myque.push(cur->left);}if (cur->right) {myque.push(cur->right);}myque.pop();}res.push_back(level);}return res;}
};

这样就可以直接用队列长度区分不同层了。

LeetCode 226 翻转二叉树

测试用例很简单,直接交换左右节点指针即可。采用递归法。

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (!root) return root;TreeNode* tmp = root->right;root->right = root->left;root->left = tmp;invertTree(root->left);invertTree(root->right);return root;}
};

采用层序遍历法:

class Solution {
public:void myswap(TreeNode*& root) {if (!root) return;TreeNode* tmp = root->right;root->right = root->left;root->left = tmp;}TreeNode* invertTree(TreeNode* root) {if (!root) return root;queue<TreeNode*> myque;myque.push(root);while (!myque.empty()) {int num = myque.size();while (num--) {TreeNode* cur = myque.front();myswap(cur);if (cur->left) myque.push(cur->left);if (cur->right) myque.push(cur->right);myque.pop();}}return root;}
};

前序遍历,注意要用一个指针保存root指针原始位置

class Solution {
public:void myswap(TreeNode*& root) {if (!root) return;TreeNode* tmp = root->right;root->right = root->left;root->left = tmp;}TreeNode* invertTree(TreeNode* root) {if (!root) return root;stack<TreeNode*> mysta;TreeNode* store = root;while (root || !mysta.empty()) {while (root) {myswap(root);mysta.push(root);root = root->left;}root = mysta.top();root = root->right;mysta.pop();}root = store;return root;}
};

中序遍历会遇到一些麻烦的问题,因为遍历完子节点,到根节点,要是交换了根节点,那么右节点就会变子节点了。今天打卡没有要求,暂时就实现到这里,我们看下一题。

LeetCode 101 对称二叉树

递归法:

左右子节点交换判断,其实很简单

class Solution {
public:bool check(TreeNode* p, TreeNode* q) {if (!p && !q) return true;if (!p && q) return false;if (p && !q) return false;return p->val == q->val && check(p->left, q->right) && check(p->right, q->left);}bool isSymmetric(TreeNode* root) {return check(root, root);}
};

迭代法:

用一个队列将根节点入队列两次,之后每次取出两个节点比较,需要再往下判断的话,将两个节点左右节点相反顺序放入继续比较。

class Solution {
public:bool isSymmetric(TreeNode* root) {queue<TreeNode*> myque;if (!root) return true;myque.push(root);myque.push(root);while (!myque.empty()) {TreeNode* p = myque.front();myque.pop();TreeNode* q = myque.front();myque.pop();if (!p && !q) continue;if (!p && q) return false;if (p && !q) return false;if (p->val != q->val) return false;myque.push(p->left);myque.push(q->right);myque.push(p->right);myque.push(q->left);}return true;}
};

需要注意的是!p和!q的时候是进入下一重循环而不是直接return true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode】二叉树的构造题目总结

108. 将有序数组转换为二叉搜索树 /*** 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), ri…

Flask教程3:jinja2模板引擎

文章目录 模板的导入与使用 模板的导入与使用 Flask通过render_template来实现模板的渲染&#xff0c;要使用这个方法&#xff0c;我们需要导入from flask import rander_template&#xff0c;模板中注释需放在{# #}中 模板的第一个参数为指定的模板文件名称&#xff0c;如自定…

Rust Rocket创建第一个hello world的Web程序 Rust Rocket开发常用网址和Rust常用命令

一、Rust Rocket简介 Rust Rocket 是一个用 Rust 语言编写的 Web 应用框架&#xff0c;它结合了 Rust 的安全性和性能优势&#xff0c;以及 Web 开发的便利性。以下是 Rust Rocket 框架的一些优点&#xff1a; 安全性&#xff1a;Rust 是一种注重安全性的编程语言&#xff0c;…

一些不错的技术网站(持续更新)

嵌入式&#xff1a; GitHub - nhivp/Awesome-Embedded: A curated list of awesome embedded programming. ELF 文件、镜像&#xff08;Image&#xff09;文件、可执行文件、对象文件详解 uboot 启动流程详细分析 树莓派PICO-OLED图片和视频_树莓派控制oled显示视频-CSDN博…

显卡矩阵计算能不能替代3dmark 的甜甜圈烤机

显卡矩阵计算通常是指利用显卡的并行处理能力来进行大规模的数学运算&#xff0c;这在科学计算、大数据处理、以及深度学习等领域非常常见。而3DMark的甜甜圈烤机&#xff08;Dynamoometer&#xff09;则是一种专门用于测试显卡在连续运行高负载3D图形渲染时的性能和稳定性的工…

【C++】学习笔记——vector_2

文章目录 七、vector2. vecotr的使用3. vector的模拟实现 未完待续 七、vector 2. vecotr的使用 上节我们以二维数组结束&#xff0c;这一节我们以二维数组开始。 // 二维数组 vector<vector<int>> vv;二维数组在底层是连续的一维数组。vv[i][j] 是怎样访问的&a…

分布式与一致性协议之一致哈希算法(二)

一致哈希算法 使用哈希算法有什么问题 通过哈希算法&#xff0c;每个key都可以寻址到对应的服务器&#xff0c;比如&#xff0c;查询key是key-01,计算公式为hash(key-01)%3,警告过计算寻址到了编号为1的服务器节点A&#xff0c;如图所示。 但如果服务器数量发生变化&#x…

vue3使用el-autocomplete请求远程数据

服务器端 RestController RequestMapping("/teacher") public class TeacherController {Resourceprivate TeacherService teacherService;GetMapping({"/v1/getTop10TeacherByName/","/v1/getTop10TeacherByName/{name}"})public ResultBean&l…

快速批量重命名文件(夹)

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 我这里处理这4个文本&#xff0c;实际可以处理任意数量的文本和文件夹 1、打开工具&#xff0c;进入文件批量复制版块 2、点击“重命名” 3、把要重命名的…

使用Python爬取淘宝商品并做数据分析

使用Python爬取淘宝商品并做数据分析&#xff0c;可以按照以下步骤进行操作&#xff1a; 确定需求&#xff1a;确定要爬取的淘宝商品的种类、数量、关键词等信息。 编写爬虫程序&#xff1a;使用Python编写爬虫程序&#xff0c;通过模拟浏览器请求&#xff0c;获取淘宝商品的页…

Docker 中的 Nginx 服务为什么要启用 HTTPS

一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4 安装Docker CE 20.10.17 s…

python制作可执行文件(cython)

使用Cython将Python脚本编译成可执行文件涉及几个步骤。以下是一个基本的指南&#xff1a; 1. 安装Cython 首先&#xff0c;你需要安装Cython。你可以使用pip来安装&#xff1a; pip install cython 2. 编写Cython文件 通常&#xff0c;Cython源文件的后缀是.pyx。你可以将…

第182期 23ai:惊喜的全功能缓存True Cache-2安装部署(20240505)

数据库管理182期 2024-05-05 数据库管理-第182期 23ai:惊喜的全功能缓存True Cache-2安装部署&#xff08;20240505&#xff09;1 主机配置2 操作系统配置2.1 基础配置2.2 配置hosts2.3 安装preinstall RPM包2.4 创建目录2.5 配置环境变量 3 部署数据库3.1 部署DB软件3.2 创建监…

机器学习:基于K-近邻(KNN)、高斯贝叶斯(GaussianNB)、SVC、随机森林(RF)、梯度提升树(GBDT)对葡萄酒质量进行预测

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

linux上如何排查JVM内存过高?

怎么排查JVM内存过高&#xff1f; 前言&#xff1a; 想必工作一两年以后的同学都会逐渐面临到&#xff0c;jvm等问题&#xff0c;但是可能苦于无法熟练的使用一些工具&#xff1b;本文将介绍几个比较常用分析工具的使用方法&#xff0c;带着大家一步步定位分析问题。 1、top 查…

uni-app 从vue3项目创建到Pinia管理数据全局使用 持久化存储数据 详细教程

一、创建uni-app项目 1. 安装HBuilder X&#xff0c;下载地址&#xff1a;https://www.dcloud.io/hbuilderx.html 2. 打开HBuilder X&#xff0c;点击左上角的“文件”->“新建”->“项目”&#xff0c;选择“uni-app”项目模板&#xff0c;填写项目名称和项目路径&…

从 Word 文档中提取所有的有效 JSON 对象(包含跨段落)

文章目录 一、概述二、代码 一、概述 从 word 中提取所有有效 json &#xff08;包含跨段落的 json&#xff09;。 二、代码 """ 从 Word 文档中提取所有的 JSON 对象 """from docx import Document import jsondef extract_json_from_docx(d…

springmvc下

第二类初始化操作 multipartResolver应用 localeResolver应用 themeResolver应用 handlerMapping应用 handlerAdapter应用 handlerExceptionReslver requestToViewNameTranslator应用 viewResolver应用 flashMapManager应用 dispatcherServlet逻辑处理 processRequest处理web请…

目标跟踪—卡尔曼滤波

目标跟踪—卡尔曼滤波 卡尔曼滤波引入 滤波是将信号中特定波段频率滤除的操作&#xff0c;是抑制和防止干扰的一项重要措施。是根据观察某一随机过程的结果&#xff0c;对另一与之有关的随机过程进行估计的概率理论与方法。 历史上最早考虑的是维纳滤波&#xff0c;后来R.E.卡…

相差8小时:时区设置导致docker中的openGauss时间问题

文章目录 &#xff08;一&#xff09;问题&#xff08;二&#xff09;解决&#xff08;2.1&#xff09;确认服务器时间&#xff08;2.2&#xff09;确认和修改docker时间&#xff08;2.2.1&#xff09;失败的尝试&#xff08;2.2.2&#xff09;成功的尝试 &#xff08;2.2&…