【LeetCode Solutions】LeetCode 101 ~ 105 题解

CONTENTS

  • LeetCode 101. 对称二叉树(简单)
  • LeetCode 102. 二叉树的层序遍历(中等)
  • LeetCode 103. 二叉树的锯齿形层序遍历(中等)
  • LeetCode 104. 二叉树的最大深度(简单)
  • LeetCode 105. 从前序与中序遍历序列构造二叉树(中等)

LeetCode 101. 对称二叉树(简单)

【题目描述】

给你一个二叉树的根节点 root,检查它是否轴对称。

【示例 1】

在这里插入图片描述

输入:root = [1,2,2,3,4,4,3]
输出:true

【示例 2】

在这里插入图片描述

输入:root = [1,2,2,null,3,null,3]
输出:false

【提示】

树中节点数目在范围 [ 1 , 1000 ] [1, 1000] [1,1000]
− 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 100<=Node.val<=100

进阶:你可以运用递归和迭代两种方法解决这个问题吗?


【分析】

对称的树具有以下属性之一:

  • 左右子节点均为空;
  • 左右子节点的值相同,且左子节点的左子树与右子节点的右子树相同,左子节点的右子树与右子节点的左子树相同。

因此我们可以递归判断左右子树是否对称。

题目提到用递归和迭代实现,那么如何用迭代实现?

可以用队列维护对称的相对关系,首先将根节点的左右子节点入队,然后不断循环每次从队列中取两个节点,判断这两个节点是否对称,然后将其中一个节点的左/右子节点与另一个节点的右/左子节点对应成两组分别加入到队列中,如果队列为空遍历完整棵树还没发现非对称的节点说明整棵树就是对称的。


【代码】

【递归方法】

/*** 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), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSymmetric(TreeNode* root) {return dfs(root->left, root->right);}bool dfs(TreeNode* l, TreeNode* r) {if (!l && !r) return true;  // 两个节点均为空if (!l || !r || l->val != r->val) return false;  // 只有一个节点为空或两个节点值不同return dfs(l->left, r->right) && dfs(l->right, r->left);  // 左节点的左/右子树要和右节点的右/左子树对称}
};

【迭代方法】

/*** 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), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSymmetric(TreeNode* root) {queue<TreeNode*> Q;Q.push(root->left), Q.push(root->right);while (!Q.empty()) {auto p = Q.front(); Q.pop();auto q = Q.front(); Q.pop();if (!p && !q) continue;if (!p || !q || p->val != q->val) return false;  // 不对称Q.push(p->left), Q.push(q->right);  // p 的左子节点需要和 q 的右子节点对称Q.push(p->right), Q.push(q->left);  // p 的右子节点需要和 q 的左子节点对称}return true;  // 全遍历完了说明树是对称的}
};

LeetCode 102. 二叉树的层序遍历(中等)

【题目描述】

给你二叉树的根节点 r o o t root root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。

【示例 1】

在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

【示例 2】

输入:root = [1]
输出:[[1]]

【示例 3】

输入:root = []
输出:[]

【提示】

树中节点数目在范围 [ 0 , 2000 ] [0, 2000] [0,2000]
− 1000 < = N o d e . v a l < = 1000 -1000 <= Node.val <= 1000 1000<=Node.val<=1000


【分析】

层序遍历就用一个队列按 BFS 序遍历就行,由于答案需要将每一层的节点分别形成一组值,因此每轮都从队列中出队当前层的所有节点。


【代码】

/*** 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), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;queue<TreeNode*> Q;if (root) Q.push(root);while (!Q.empty()) {vector<int> v;  // 当前层的所有节点值int cnt = Q.size();  // 当前层的节点数while (cnt--) {  // 逐个出队当前层的所有节点TreeNode* t = Q.front();Q.pop();v.push_back(t->val);if (t->left) Q.push(t->left);if (t->right) Q.push(t->right);}res.push_back(v);}return res;}
};

LeetCode 103. 二叉树的锯齿形层序遍历(中等)

【题目描述】

给你二叉树的根节点 root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

【示例 1】

在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]

【示例 2】

输入:root = [1]
输出:[[1]]

【示例 3】

输入:root = []
输出:[]

【提示】

树中节点数目在范围 [ 0 , 2000 ] [0, 2000] [0,2000]
− 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 100<=Node.val<=100


【分析】

和上一题一样,只需要额外记录一下当前层的结果是否需要翻转即可。


【代码】

/*** 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), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>> res;queue<TreeNode*> Q;if (root) Q.push(root);for (bool i = false; !Q.empty(); i ^= true) {  // i 表示当前层是否需要翻转vector<int> v;int cnt = Q.size();while (cnt--) {TreeNode* t = Q.front();Q.pop();v.push_back(t->val);if (t->left) Q.push(t->left);if (t->right) Q.push(t->right);}if (i) reverse(v.begin(), v.end());res.push_back(v);}return res;}
};

LeetCode 104. 二叉树的最大深度(简单)

【题目描述】

给定一个二叉树 root,返回其最大深度。

二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。

【示例 1】

在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:3

【示例 2】

输入:root = [1,null,2]
输出:2

【提示】

树中节点的数量在 [ 0 , 1 0 4 ] [0, 10^4] [0,104] 区间内。
− 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 100<=Node.val<=100


【分析】

用 BFS 也就是类似前两题的做法能够求出层数,也可以直接用递归求解,从根节点往下递归求解每个节点的高度,到空节点了高度就为 0,否则当前节点的高度就是左子树与右子树中的最大高度加一(当前节点的高度比子树多 1)。


【代码】

/*** 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), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {  // 返回 root 的最大高度if (!root) return 0;return max(maxDepth(root->left), maxDepth(root->right)) + 1;}
};

LeetCode 105. 从前序与中序遍历序列构造二叉树(中等)

【题目描述】

给定两个整数数组 preorderinorder,其中 preorder 是二叉树的先序遍历,inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

【示例 1】

在这里插入图片描述

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

【示例 2】

输入: preorder = [-1], inorder = [-1]
输出: [-1]

【提示】

1 < = p r e o r d e r . l e n g t h < = 3000 1 <= preorder.length <= 3000 1<=preorder.length<=3000
i n o r d e r . l e n g t h = = p r e o r d e r . l e n g t h inorder.length == preorder.length inorder.length==preorder.length
− 3000 < = p r e o r d e r [ i ] , i n o r d e r [ i ] < = 3000 -3000 <= preorder[i], inorder[i] <= 3000 3000<=preorder[i],inorder[i]<=3000
preorderinorder无重复元素
inorder 均出现在 preorder
preorder 保证为二叉树的前序遍历序列
inorder 保证为二叉树的中序遍历序列


【分析】

根据前序或后序遍历与中序遍历构建二叉树是必须要掌握的基础知识,详细讲解可以转到:【UCB CS 61B SP24】Lecture 22 & 23: Tree and Graph Traversals, DFS, BFS。

简单概括思路就是前序遍历的第一个节点就是根节点,然后在中序遍历中找到根节点就能够区分出根节点的左右子树区间,根据左右子树节点数量再递归创建左右子树。


【代码】

/*** 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), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {return build(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);}TreeNode* build(vector<int>& pre, int preSt, int preEd, vector<int>& in, int inSt, int inEd) {if (preSt > preEd) return nullptr;TreeNode* root = new TreeNode(pre[preSt]);  // 根节点就是前序遍历的第一个节点int k = inSt;while (in[k] != pre[preSt]) k++;  // 在中序遍历中找到根节点int leftChildNum = k - inSt;  // 左子树节点数root->left = build(pre, preSt + 1, preSt + leftChildNum, in, inSt, k - 1);root->right = build(pre, preSt + leftChildNum + 1, preEd, in, k + 1, inEd);return root;}
};

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

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

相关文章

革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall

根据QYR&#xff08;恒州博智&#xff09;的统计及预测&#xff0c;2024年全球汽车无线紧急呼叫&#xff08;eCall&#xff09;设备市场销售额达到了25.17亿美元&#xff0c;预计2031年将达到44.97亿美元&#xff0c;年复合增长率&#xff08;CAGR 2025-2031&#xff09;为8.8%…

Redis-04.Redis常用命令-字符串常用命令

一.字符串操作命令 set name jack 点击左侧name&#xff0c;显示出值。 get name get abc&#xff1a;null setex key seconds value&#xff1a;设置过期时间&#xff0c;过期后该键值对将会被删除。 然后再get&#xff0c;在过期时间内可以get到&#xff0c;过期get不到。…

一文总结常见项目排查

慢sql排查 怎么排查 通过如下命令&#xff0c;开启慢 SQL 监控&#xff0c;执行成功之后&#xff0c;客户端需要重新连接才能生效。 -- 开启慢 SQL 监控 set global slow_query_log 1; 默认的慢 SQL 阀值是10秒&#xff0c;可以通过如下语句查询慢 SQL 的阀值。 -- 查询慢…

使用Python爬虫获取淘宝App商品详情

在电商领域&#xff0c;获取商品详情数据对于市场分析、竞品研究和用户体验优化至关重要。淘宝作为国内领先的电商平台&#xff0c;提供了丰富的商品资源。虽然淘宝App的数据获取相对复杂&#xff0c;但通过Python爬虫技术&#xff0c;我们可以高效地获取淘宝App商品的详细信息…

Redis-06.Redis常用命令-列表操作命令

一.列表操作命令 LPUSH key value1 [value2]&#xff1a; LPUSH mylist a b c d: LRANGE key start stop&#xff1a; LRANGE mylist 0 -1&#xff1a; lrange mylist 0 2&#xff1a; d c b RPOP KEY&#xff1a;移除并返回最后一个元素 RPOP list a LLEN key…

客户端给服务器发数据,服务器不显示:开放端口操作

当你写完UDP/TCP代码进行测试时&#xff0c;发现没出什么错误&#xff0c;但是不管你客户端怎么发送消息&#xff0c;服务器就是不显示&#xff0c;那么很有可能你云服务器没开放端口。比如&#xff1a; 接下来教你开放端口&#xff1a; 一&#xff1a;进入你买云服务器的页面…

IDApro直接 debug STM32 MCU

使用IDA pro 逆向分析muc 固件的时候&#xff0c; 难免要进行一些动态的debug&#xff0c;来进一步搞清楚一些内存的数据、算法等&#xff0c;这时候使用远程debug 的方式直接在mcu上进行debug 最合适不过了。 不过有个前提条件就是一般来说有的mcu 会被运行中的代码屏蔽 RDP、…

系统与网络安全------Windows系统安全(1)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 用户账号基础 本地用户账号基础 用户账号概述 用户账号用来记录用户的用户名和口令、隶属的组等信息 每个用户账号包含唯一的登录名和对应的密码 不同的用户身份拥有不同的权限 操作系统根据SID识别不同…

测试用例管理工具

一、免费/开源工具 TestLink 适用场景&#xff1a;传统手工测试团队&#xff0c;需基础用例管理与测试计划跟踪。 关键功能&#xff1a;用例分层管理、执行结果记录、基础报告生成。 局限&#xff1a;界面陈旧&#xff0c;自动化集成需插件支持。 Kiwi TCMS 适用场景&#xff1…

漏洞挖掘---顺景ERP-GetFile任意文件读取漏洞

一、顺景ERP 顺景 ERP 是广东顺景软件科技有限公司研发的企业资源规划系统。它以制造为核心&#xff0c;融合供应链、财务等管理&#xff0c;打破部门壁垒&#xff0c;实现全程无缝管理。该系统功能丰富&#xff0c;支持多语言、多平台&#xff0c;具备柔性流程、条码应用等特色…

关于bug总结记录

1、vs中出现bug error C1083:无法打开文件 链接&#xff1a;vs中出现bug error C1083:无法打开文件_vs20151083错误解决方法-CSDN博客 2、 VS小技巧&#xff1a;系统却提示&#xff1a;示msvcp120.dll丢失 链接&#xff1a;VS小技巧&#xff1a;系统却提示&#xff1a;示msvc…

2023码蹄杯真题

题目如下 代码如下

如何在不同的分辨率均能显示出清晰的字体?

问题 设计好的窗体&#xff0c;当屏幕的分辨率改变时&#xff0c;字体放大好变得模糊。 解决办法 //高低版本&#xff0c;均可使用[DllImport("user32.dll")]private static extern bool SetProcessDPIAware(); //高版本windows,可选用以下 [DllImport("user…

北斗导航 | 基于因子图优化的GNSS/INS组合导航完好性监测算法研究,附matlab代码

以下是一篇基于因子图优化(FGO)的GNSS/INS组合导航完好性监测算法的论文框架及核心内容,包含数学模型、完整Matlab代码及仿真分析基于因子图优化的GNSS/INS组合导航完好性监测算法研究 摘要 针对传统卡尔曼滤波在组合导航完好性监测中对非线性与非高斯噪声敏感的问题,本文…

wordpress的cookie理解

登录 wordpress 登录 wordpress 的时候 Cookie 显示为 PHPSESSIDubilj5ad65810hqv88emitmvkc; isLogintrue; night0; wordpress_logged_in_27e3261db108cd80480af5f900ac865e1735846526%7C1744418831%7CrTugvME3l2ZITBoxf6JAsAn4woFdbIZvggvvKDRHQhc%7C3fa99b7f0728dffc47f75…

JavaScript 中的原型链与继承

JavaScript 是一种基于原型的编程语言&#xff0c;这意味着它的对象继承是通过原型链而非类的机制来实现的。原型链是 JavaScript 中对象与对象之间继承属性和方法的基础。本文将深入探讨 JavaScript 中的原型链和继承机制&#xff0c;帮助你理解这一重要概念。 一、原型&…

2.pycharm部署Ai - 编程好助手

一、pycharm安装continue插件 1.提前安装好pycharm&#xff0c;并双击打开 2.File – Setting 3.Plugins – 搜索Continue &#xff0c; 点击Install安装 4.点ok 二、获取硅基流动API 1.登入网站&#xff1a;https://siliconflow.cn/zh-cn/#/&#xff0c;并注册登入 2.获取AP…

【蓝桥杯14天冲刺课题单】Day3

1. 题目链接&#xff1a;1025 答疑 贪心类型的题目做法很简单&#xff0c;只需要保证局部解最优即可保证整体解最优。 这里的思路就是第i个学生前面的人答疑所用的时间最短&#xff0c;那么他所发送短信的时间节点越小。这道题目有个需要注意的点是&#xff1a;要先将前i-1个…

虚拟pinctrl驱动

之前呢&#xff0c;我们讲解了在内核中pinctrl子系统是怎么实现的&#xff0c;今天我们来尝试一下自己去写一个pinctrl子系统&#xff1a; 首先呢&#xff0c;我们来看看一个pinctrl子系统需要做的事情: 上面的话&#xff0c;我们看了一个pinctrl子系统需要的三大功能以及在驱…

Spring Boot自动配置原理解析

文章目录 前言一、SpringBootConfiguration二、EnableAutoConfiguration2.1、AutoConfigurationPackage2.2、Import(AutoConfigurationImportSelector.class) 三、ComponentScan四、自动配置源码4.1、获取所有候选的自动配置类4.2、过滤不满足条件的自动配置 总结 前言 在常规的…