【散刷】二叉树基础OJ题(二)

article/2025/6/15 6:22:20

📝前言说明:
本专栏主要记录本人的基础算法学习以及刷题记录,使用语言为C++。
每道题我会给出LeetCode上的题号(如果有题号),题目,以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的讲解,主要是个人见解,如有不正确,欢迎指正,一起进步!

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C++学习笔记,C语言入门基础,python入门基础,python刷题专栏
🎀CSDN主页 愚润泽

题目

  • 226. 翻转二叉树
  • 110. 平衡二叉树
  • 102. 二叉树的层序遍历
  • 606. 根据二叉树创建字符串
  • 102. 二叉树的层序遍历
  • 107. 二叉树的层序遍历 II
  • 236. 二叉树的最近公共祖先

226. 翻转二叉树

题目链接
在这里插入图片描述

大问题化小问题:根节点的左右子树要反转,左右子树的左右子树也要反转
注意点:将子树反转后的结果记录,供上一层翻转使用

TreeNode* invertTree(TreeNode* root) 
{// 左子树成为右子树if(root == nullptr){return nullptr;}auto left = invertTree(root->left); // 递归左子树,并且将左子树的反转结果记录auto right = invertTree(root->right);root->left = right;root->right = left; // 记录后,用于翻转本层return root;
}

110. 平衡二叉树

题目链接
在这里插入图片描述

大问题化小问题:一棵树如果是平衡二叉树,则他的左右子树也是平衡二叉树。
将问题转换为获取高度的问题,判断高度差是否大于1

class Solution {
public:int get_h(TreeNode* root){if(root == nullptr) {return 0;}return max(get_h(root->left), get_h(root->right)) + 1;}bool isBalanced(TreeNode* root) {if(root ==nullptr){return true;}return (abs(get_h(root->left) - get_h(root->right)) <= 1) && isBalanced(root->left) && isBalanced(root->right);}
};

102. 二叉树的层序遍历

题目链接
在这里插入图片描述

这道题和之前做过的题不同在:需要将每一层的元素单独存在一个vector里面,要怎么实现呢?
原来我们只用一个队列进行操作,队头元素遍历后就出队列,然后把它的孩子入队列。但是这种操作我们没办法进行层与层的区分。
为了区分层与层,我们可以用两个队列:1,当前遍历的节点队列,2,下一层要遍历的节点队列。不难发现,当前要遍历的所有节点的孩子就是下一层要遍历的节点。所以我们只需要让孩子入队列时入到不同的队列即可。

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> ans;if(root == nullptr) // 针对空树{return {}; // 用{}表示空vector} vector<TreeNode*> cur = {root}; // 非空树时,当层要遍历的节点while(!cur.empty()){vector<int> vals; // 用来存放当前层节点的值vector<TreeNode*> nxt; // 下一层要遍历的节点for(auto node: cur) // queue是容器适配器,没有迭代器{vals.push_back(node->val);if (node->left) nxt.push_back(node->left); // 要确保入队列的不是空指针,不然node->val 会出问题if (node->right) nxt.push_back(node->right);}cur = move(nxt); // 相当于一次全出栈了,并且更换了 curans.push_back(vals);}return ans;}
};

606. 根据二叉树创建字符串

题目链接
在这里插入图片描述

class Solution {
public:string ans;void dfs(TreeNode* root){if(!root) return;string ch = to_string(root -> val);ans += ch;if(!root->left && root->right)ans += "()";if(root->left){ans += "(";dfs(root->left);ans += ")";}if(root->right){ans += "(";dfs(root->right);ans += ")";}}string tree2str(TreeNode* root) {dfs(root);return ans;}
};
  • 唯一麻烦的就是:处理什么时候加()的问题

102. 二叉树的层序遍历

题目链接
在这里插入图片描述

  • 利用队列辅助:每次从队头取出一个节点处理,并将其子节点(下一层)放入队尾。
  • 如何分层?当还没有开始操作时,当前queue中节点的个数就是当前层节点的个数。
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {if(!root) return {};vector<vector<int>> ans;queue<TreeNode*> q;q.push(root); while(!q.empty()){vector<int> path; // path 的生命周期只有一次while循环for(int i = q.size(); i > 0; i--){auto node = q.front(); // 获得队头节点path.push_back(node -> val);q.pop(); // 输出队头节点if (node->left) q.push(node->left);if (node->right) q.push(node->right);}ans.emplace_back(path);}return ans;}
};

107. 二叉树的层序遍历 II

题目链接
在这里插入图片描述
只需将上一题的答案翻转即可。记住队列的用途是确保FIFO,使得左边的比右边的先出,保证的是一层的顺序。

class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {if(!root) return {};vector<vector<int>> ans_tmp;queue<TreeNode*> q;q.push(root);while(!q.empty()){vector<int> path;for(int i = q.size(); i > 0; i--){auto node = q.front();path.push_back(node->val);q.pop();if(node -> left) q.push(node->left);if(node -> right) q.push(node->right);}ans_tmp.emplace_back(path);}vector<vector<int>> ans;for(int i = ans_tmp.size() - 1; i >= 0; i--)ans.emplace_back(ans_tmp[i]);return ans;}
};

236. 二叉树的最近公共祖先

题目链接
在这里插入图片描述

class Solution {
public:// 以 root 为根节点的数包同时包含 p 和 q 则代表该节点是祖先bool dfs(TreeNode* root, TreeNode* node) // node是要寻找的节点{if(!root) return false;return root == node || dfs(root->left, node) || dfs(root->right, node);}TreeNode* solution(TreeNode* root, TreeNode* p, TreeNode* q){// 后续遍历,深度可以尽可能大if(!root) return nullptr; TreeNode* lret = solution(root->left, p, q);TreeNode* rret = solution(root->right, p, q);// 一旦有结果立马返回if(lret || rret) return lret? lret : rret; // 如果lret有,则一定是lret先返回if(dfs(root, p) && dfs(root, q))return root;elsereturn nullptr;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {return solution(root, p, q);}
};

当然,代码写的不是很优雅。

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!


http://www.hkcw.cn/article/ZKNlQmYjNs.shtml

相关文章

深度学习与特征交叉:揭秘FNN与SNN在点击率预测中的应用

今天&#xff0c;给大家分享一篇关于基于深度神经网络&#xff08;DNNs&#xff09;的特征交叉方法——FNN&#xff08;Factorization-machine supported Neural Network&#xff09;和SNN&#xff08;Sampling-based Neural Network&#xff09;的研究。随着广告点击率预估等领…

Win11系统不推送24H2/西数SSD无法安装24H2 - 解决方案

Win11系统不推送24H2/西数SSD无法安装24H2 - 解决方案 前言获取24H2推送西数SSD安装24H2更新SSD固件规避设备检查修改注册表&#xff08;可选&#xff09; 前言 Win11 24H2系统优化了底层架构&#xff0c;加快了系统响应速度&#xff0c;并在25年5月份开始推送&#xff0c;但很…

Elasticsearch集群最大分片数设置详解:从问题到解决方案

目录 前言 1 问题背景&#xff1a;重启后设置失效 2 核心概念解析 2.1 什么是分片(Shard)&#xff1f; 2.2 cluster.max_shards_per_node的作用 2.3 默认值是多少&#xff1f; 3 参数设置的两种方式 3.2 持久性设置(persistent) 3.2 临时设置(transient) 4 问题解决方…

机器学习:集成学习概念、分类、随机森林

本文目录&#xff1a; 一、集成学习概念**核心思想&#xff1a;** 二、集成学习分类&#xff08;一&#xff09;Bagging集成&#xff08;二&#xff09;Boosting集成(三&#xff09;两种集成方法对比 三、随机森林 一、集成学习概念 集成学习是一种通过结合多个基学习器&#…

Python基于SVM技术的手写数字识别问题项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在当今数字化转型加速的时代&#xff0c;手写数字识别作为图像处理与机器学习领域的一个经典问题&#xff0c;具有广…

MySQL 全量、增量备份与恢复

一.MySQL 数据库备份概述 备份的主要目的是灾难恢复&#xff0c;备份还可以测试应用、回滚数据修改、查询历史数据、审计等。之前已经学习过如何安装 MySQL&#xff0c;本小节将从生产运维的角度了解备份恢复的分类与方法。 1 数据备份的重要性 在企业中数据的价值至关…

Python Pytest

1.Pytest用例发现规则 1.1 模块名(python文件)名必须以 test_ 开头或 _test 结尾&#xff0c;如 test_case&#xff0c;case_test&#xff0c;下划线都不能少 1.2 模块不能放在 . 开头的隐藏目录或者叫 venv的目录下&#xff0c;virtual environment&#xff0c;叫venv1都可以…

[Linux] MySQL源码编译安装

目录 环境包安装 创建程序用户 解压源码包 配置cmake ​编辑编译 安装 配置修改属性 属主和属组替换成mysql用户管理 系统环境变量配置 初始化数据库 服务管理 启动 环境包安装 yum -y install ncurses ncurses-devel bison cmake gcc gcc-c 重点强调&#xff1a;采…

RK3568-移植codesys-runtime

PC下载安装CODESYS Development System V3.5.17.0 https://store.codesys.com/en/codesys.html#product.attributes.wrapperPC下载安装 CODESYS Control for Linux ARM64 SL 4.1.0.0.package https://store.codesys.com/en/codesys-control-for-linux-arm-sl-1.html 注意&…

安装和配置 Nginx 和 Mysql —— 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录6

前言 昨天更新了四篇博客&#xff0c;我们顺利的 安装了 ubuntu server 服务器&#xff0c;并且配置好了 ssh 免密登录服务器&#xff0c;安装好了 服务器常用软件安装, 配置好了 zsh 和 vim 以及 通过 NVM 安装好Nodejs&#xff0c;还有PNPM包管理工具 。 作为服务器的运行…

nav2笔记-250603

合作背景&#xff1a; AMD与Open Navigation在过去几个月里进行了合作&#xff0c;旨在向ROS 2社区展示AMD强大的Ryzen AI、Embedded和Kria能力。 演示内容&#xff1a; 帖子提到&#xff0c;他们已经开始展示如何使用Ryzen AI为自主机器人产品提供动力&#xff0c;在各种现实世…

黑马Java面试笔记之 消息中间件篇(RabbitMQ)

一. 消息丢失问题 RabbitMQ如何保证消息不丢失&#xff1f; 使用场景有&#xff1a; 异步发送&#xff08;验证码、短信、邮件... &#xff09;MYSQL和Redis&#xff0c;ES之间的数据同步分布式事务削峰填谷...... 消息丢失原因会有三种情况&#xff0c;分别分析一下 1.1 生…

如何使用插件和子主题添加WordPress自定义CSS(附:常见错误)

您是否曾经想更改网站外观的某些方面&#xff0c;但不知道怎么做&#xff1f;有一个解决方案——您可以将自定义 CSS&#xff08;层叠样式表&#xff09;添加到您的WordPress网站&#xff01; 在本文中&#xff0c;我们将讨论您需要了解的有关CSS的所有知识以及如何使用它来修…

NLP学习路线图(二十):FastText

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;词向量&#xff08;Word Embedding&#xff09;是基石般的存在。它将离散的符号——词语——转化为连续的、富含语义信息的向量表示&#xff0c;使得计算机能够“理解”语言。而在众多词向量模型中&#xff0c;FastT…

小巧实用,Windows文件夹着色软件推荐

软件介绍 本文介绍一款能实现Windows系统文件夹颜色分类的软件。 软件特点 这款软件免费且开源&#xff0c;体积仅1.35MB&#xff0c;小巧轻便&#xff0c;适合喜欢小工具的用户。 软件安装 安装过程十分便捷&#xff0c;打开软件后点击“install”即可完成安装。 基本操作…

解决Vditor加载Markdown网页很慢的问题(Vite+JS+Vditor)

1. 引言 在上一篇文章《使用Vditor将Markdown文档渲染成网页(ViteJSVditor)》中&#xff0c;详细介绍了通过Vditor将Markdown格式文档渲染成Web网页的过程&#xff0c;并且实现了图片格式居中以及图片源更换的功能。不过&#xff0c;笔者发现在加载这个渲染Markdown网页的时候…

leetcode hot100刷题日记——36.最长连续序列

解答&#xff1a; 实际上在哈希表中存储不重复的数字。 然后遍历哈希表&#xff0c;找间隔&#xff0c;更新最大间隔。 class Solution { public:int longestConsecutive(vector<int>& nums) {unordered_set<int>hash;for(int num:nums){hash.insert(num);}in…

Unity Mac 笔记本操作入门

在 macOS 笔记本电脑上使用 Unity Editor 的场景视图 (Scene View) 旋转视角&#xff0c;主要依赖于触摸板手势和键盘修饰键的组合。由于没有物理中键&#xff0c;操作方式会与 Windows 鼠标略有不同。 以下是具体的旋转视角操作&#xff1a; 1. 基本旋转视角 (Orbit) 这是最…

【笔记】使用Media Creation Tool给新主机装win10魔改iso

前提&#xff1a; win10的iso是魔改的 已经下载好在旧电脑 在这里随便挑一个符合你要求的Win10系统下载_Win10专业版_windows10正式版下载 - 系统之家 下载好win10版本的媒体创建工具https://www.microsoft.com/zh-cn/software-download/windows10 制作装机U盘 插入U盘 管理…

深圳南柯电子|储能EMC整改:如何节省70%整改费用的实战方法

在新能源产业蓬勃发展的当下&#xff0c;储能系统作为电网调峰、可再生能源消纳的核心载体&#xff0c;其电磁兼容性&#xff08;EMC&#xff09;问题日益成为制约行业发展的技术瓶颈。EMC&#xff08;Electromagnetic Compatibility&#xff09;即电磁兼容性&#xff0c;指设备…