力扣练习题(2024/5/2)

embedded/2024/9/20 13:38:31/ 标签: leetcode, 算法, 数据结构

1填充每个节点的下一个右侧节点指针

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

示例 1:

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

示例 2:

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

提示:

  • 树中节点的数量在 [0, 212 - 1] 范围内
  • -1000 <= node.val <= 1000

解题思路:

 1. 首先定义一个节点结构体,包含节点的值、左节点、右节点和指向同一层下一个节点的指针。  2. 使用队列que存储每一层的节点,初始时将根节点放入队列中。

 3. 进入while循环,直到队列为空。每次循环表示处理一层节点。

 4. 在每层节点的循环中,先获取当前层节点数size,然后遍历当前层所有节点。

5. 若当前是该层的第一个节点(i == 0),则将该节点作为当前层的头结点,并弹出队列。

6. 否则,将当前节点与前一个节点连接(nodePre->next = node),并维护前一个节点为当前节点。

 7. 检查当前节点是否有左右子节点,有则加入队列中,以便后续处理下一层节点。

 8. 这样循环直到处理完当前层所有节点,最后一个节点的next指针指向NULL。

9. 返回根节点,表示连接完成。 

代码:

class Solution {
public:Node* connect(Node* root) {queue<Node*> que;if (root != NULL) {que.push(root); // 将根节点放入队列中}while (!que.empty()) {int size = que.size(); // 当前层的节点个数Node* nodePre; // 记录当前节点的前一个节点Node* node;for (int i = 0; i < size; i++) {if (i == 0) {nodePre = que.front(); // 取出一层的头结点que.pop();node = nodePre;} else {node = que.front();que.pop();nodePre->next = node; // 本层前一个节点next指向本节点nodePre = nodePre->next;}if (node->left) {que.push(node->left); // 将下一层的左节点放入队列中}if (node->right) {que.push(node->right); // 将下一层的右节点放入队列中}}nodePre->next = NULL; // 本层最后一个节点指向NULL}return root;}
};

2二叉树的最大深度

简单

相关标签

相关企业

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

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

示例 1:

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

示例 2:

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

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100

思路:

  1. 首先判断根节点是否为空,如果为空直接返回深度0。
  2. 定义一个整型变量maxDepth用于记录最大深度,初始化为0。
  3. 使用队列que进行层次遍历,将根节点放入队列中。
  4. 进入while循环,直到队列为空。每次循环表示处理一层节点。
  5. 在每层节点的循环中,先获取当前层节点数size,然后遍历当前层所有节点。
  6. 每次循环遍历时,深度加一。
  7. 取出队列中的节点,如果节点有左孩子,则将左孩子节点加入队列;如果节点有右孩子,则将右孩子节点加入队列。
  8. 当处理完当前层所有节点后,继续下一轮while循环,直到遍历完所有节点。
  9. 最后返回最大深度。

代码:

class Solution {
public:int maxDepth(TreeNode* root) {if(root == nullptr)  return 0; // 如果根节点为空,返回深度0int maxDepth = 0; // 初始化最大深度为0queue<TreeNode*> que; // 定义队列用于层次遍历que.push(root); // 将根节点放入队列中while(!que.empty()){int size = que.size(); // 当前层的节点个数maxDepth++; // 深度加一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 maxDepth; // 返回最大深度}
};

3二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

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

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

提示:

  • 树中节点数的范围在 [0, 105] 内
  • -1000 <= Node.val <= 1000

思路:

  1. 首先判断根节点是否为空,如果为空直接返回深度0。
  2. 定义一个整型变量minDepth用于记录最小深度,初始化为0。
  3. 使用队列que进行层次遍历,将根节点放入队列中。
  4. 进入while循环,直到队列为空。每次循环表示处理一层节点。
  5. 在每层节点的循环中,先获取当前层节点数size,然后遍历当前层所有节点。
  6. 每次循环遍历时,深度加一。
  7. 取出队列中的节点,如果节点有左孩子,则将左孩子节点加入队列;如果节点有右孩子,则将右孩子节点加入队列。
  8. 当遍历到叶子节点时,即节点没有左右子节点,直接返回当前深度作为最小深度。
  9. 继续遍历完所有节点后,最后返回最小深度。

代码:

class Solution {
public:int minDepth(TreeNode* root) {if(root == nullptr) return 0; // 如果根节点为空,返回深度0queue<TreeNode*> que; // 定义队列用于层次遍历que.push(root); // 将根节点放入队列中int minDepth = 0; // 初始化最小深度为0while(!que.empty()){int size = que.size(); // 当前层的节点个数minDepth++; // 深度加一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); // 将右子节点加入队列if(!node->left && !node->right){ // 如果当前节点为叶子节点,直接返回深度return minDepth;}}}return minDepth; // 返回最小深度}
};

4翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

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

示例 3:

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

提示:

  • 树中节点数目范围在 [0, 100] 内
  • -100 <= Node.val <= 100

1递归思路:

  1. 首先判断根节点是否为空,如果为空直接返回。
  2. 交换根节点的左右子节点,实现翻转操作。
  3. 递归调用翻转函数分别对左子树和右子树进行翻转操作。
  4. 最后返回翻转后的根节点。

代码:

class Solution {
public:// 翻转二叉树函数,输入根节点,返回翻转后的根节点TreeNode* invertTree(TreeNode* root) {if(root == nullptr) return 0; // 如果根节点为空,直接返回swap(root->left, root->right); // 交换左右子节点invertTree(root->left); // 递归翻转左子树invertTree(root->right); // 递归翻转右子树return root; // 返回翻转后的根节点}
};

2迭代法思路:

  1. 首先判断根节点是否为空,如果为空直接返回。
  2. 创建一个栈用于辅助操作,将根节点压入栈中。
  3. 循环遍历栈,每次取出栈顶节点,交换其左右子节点。
  4. 如果当前节点有左子节点,将左子节点压入栈中;如果有右子节点,将右子节点压入栈中。
  5. 循环直到栈为空,完成整个二叉树的翻转操作。

代码:

class Solution {
public:// 翻转二叉树函数,输入根节点,返回翻转后的根节点TreeNode* invertTree(TreeNode* root) {if (root == nullptr) return 0; // 如果根节点为空,直接返回stack<TreeNode*> st; // 定义一个栈用于辅助翻转操作st.push(root); // 将根节点压入栈中while (!st.empty()) { // 当栈不为空时循环执行TreeNode* node = st.top(); // 取出栈顶节点st.pop(); // 弹出栈顶节点swap(node->left, node->right); // 交换当前节点的左右子节点if (node->left) st.push(node->left); // 如果有左子节点,压入栈中if (node->right) st.push(node->right); // 如果有右子节点,压入栈中}return root; // 返回翻转后的根节点}
};


http://www.ppmy.cn/embedded/30205.html

相关文章

android studio项目实战——备忘录(附源码)

成果展示&#xff1a; 1.前期准备 &#xff08;1&#xff09;在配置文件中添加权限及启动页面顺序 ①展开工程&#xff0c;打开app下方的AndroidManifest.xml,添加权限&#xff0c;如下&#xff1a; <uses-permission android:name"android.permission.CAMERA"…

DRF视图源码分析

DRF视图源码分析 1 APIView class GenericAPIView(APIView):pass # 10功能class GenericViewSet(xxxx.View-2个功能, GenericAPIView):pass # 5功能能class UserView(GenericViewSet):def get(self,request):passAPIView是drf中 “顶层” 的视图类&#xff0c;在他的内部主要…

重看Spring聚焦BeanDefinition分析和构造

目录 一、对BeanDefinition的理解 &#xff08;一&#xff09;理解元信息 &#xff08;二&#xff09;BeanDefinition理解分析 二、BeanDefinition的结构设计分析 &#xff08;一&#xff09;整体结构体会 &#xff08;二&#xff09;重要接口和类分析 三、构造 BeanDef…

xLua热更新解决方案

图中灰色的无法实现热更新&#xff0c;而Lua代码可以打包成AB包&#xff0c;并上传到资源服务器&#xff0c; 当进入游戏检测是否有资源需要更新&#xff0c;需要则会从资源服务器下载。 学习目标 1.导入xLua框架 2.C#调用Lua 3.Lua调用C# 4.xLua热补丁 xLua框架导入和AB…

Word页脚设置“第X页共X页”的方法【域实现】

Word页脚设置“第X页共X页”的方法【域实现】 在设置Word页码格式的要求中&#xff0c;有时需要设置为“第X页共X页”这种格式&#xff0c;使用Word中的域功能可实现&#xff0c;同时&#xff0c;在某些情况下&#xff0c;可能还需要减去封面的页码&#xff0c;接下来为具体步…

机器学习常见面试题总结

1、泛华误差的分解 训练模型的目的——最小化损失函数——泛化误差可以分解为偏差&#xff08;Biase&#xff09;、方差&#xff08;Variance&#xff09;和噪声&#xff08;Noise&#xff09;。 bias&#xff1a;拟合值和真实值之间有较大的偏差。用所有可能的训练数据集训练…

设计模式:工厂模式

工厂是每个开发人员都应该知道的关键创造模式之一。它们是许多高级模式的主要组成部分。很长一段时间&#xff0c;我在不同类型的工厂模式上遇到了麻烦。此外&#xff0c;在同一篇文章中很难找到有关这些类型的信息。本文介绍 4 种类型的工厂模式&#xff1a; 工厂方法模式&…

cookie、session、token

cookie 纳入标准文档&#xff0c;标准浏览器需要遵守的协议之一&#xff0c;作为标准浏览器必须支持的。 WEB应用都是基于HTTP协议&#xff0c;标准的HTTP协议是无状态的。 什么是无状态&#xff1f; 不管是谁&#xff0c;不管是从哪个地方发起的请求。只要你的请求&#xff08…

西电大数据安全与隐私(现代密码学基础技能)

西电大数据安全与隐私(现代密码学基础技能) 大数据安全与隐私这门课的lab1,要求如下图: 采用的方案是RSA和AES相结合, 利用RSA来加密传输AES的密钥, 用AES的密钥来加密数据. 如果使用RSA加密数据, 虽然安全性会更高, 但效率低. AES加解密效率高, 但安全性会差一些, 所以采用RS…

服务器分类

服务器可以根据不同的标准进行分类&#xff0c;主要分类方式包括但不限于以下几种&#xff1a; 按应用层次划分&#xff1a; 入门级服务器&#xff1a;适用于小型企业或个人&#xff0c;处理轻量级任务。工作组级服务器&#xff1a;适合中小型企业部门&#xff0c;支持更多用户…

SpringCloud整合Gateway结合Nacos

目录 一、引入依赖 二、开启两个测试项目 2.1 order service ​编辑 2.2 user service 三、gateway项目 3.1 新建一个bootstrap.yml文件 3.2 将我们的的网关配置写道nacos里的配置里 3.3 测试&#xff1a;看能够根据网关路由到两个测试的项目 四、 优化 4.1 将项目打包…

【MySQL】如何在MySQL中编写循环

是谁的心啊 孤单地留下 他还好吗 我多想爱他 那永恒的泪 凝固那一句话 也许可能蒸发 是谁的爱啊 比泪水坚强 轻声呼唤 就让我融化 每一滴雨水 演化成我翅膀 向着我爱的人 追吧 &#x1f3b5; 飞儿乐团《月牙湾》 MySQL中的循环通常在存储过程中使用&#…

[ECE]Vivado设计流程中,“Synthesis“(综合)和 “Implementation“(实现)是两个关键步骤

是什么&#xff1f; Synthesis&#xff08;综合&#xff09;: 作用: 综合是将你的HDL代码&#xff08;如VHDL或Verilog&#xff09;转换成门级网表的过程&#xff0c;这个网表描述了逻辑门和触发器的连接方式。如何运行: 你可以在Vivado中点击“Run Synthesis”&#xff08;运…

HTML 标签通用属性

HTML 标签通用属性 通用HTML标签的属性 id 设定标签的ID name 设定标签的名称 class 设定标签样式的类选择器 style 设定标签样式属性 <basefont><font>标签通用的属性 face 用于文字的名称&#xff0c;可以是宋体、隶书、楷体等 size 用于设置字号的大小(从…

Cesium 3dTileset 支持 uv 和 纹理贴图

原理: 使用自定义shader实现uv自动计算 贴图效果: uv效果:

Teamcity为Azure的git源颁发ssh-rsa证书,使用ssl-keygen在macos下操作

Teamcity通过git,持续集成Azure源的项目时,总出现最近总出如下类似的错误: failed to checkout and determine revision: unable to list remote for ssh://gitssh.dev.azure.com/v3/<organization_name>/<project_name>/<repo_name>: unknown error: remot…

职场商务口才能力精品课

职场商务口才能力精品课&#xff08;3篇&#xff09; 以下是关于职场商务口才能力的三篇精品课内容概述&#xff1a; **篇&#xff1a;基础篇——商务口才的基石 课程主题&#xff1a;商务口才的基础技能与心态建设 内容概要&#xff1a; 商务口才的重要性&#xff1a;首先强…

UDP_INVALID_ADDRESSES_01:无效地址 - 多播源地址

测试目的&#xff1a; 验证当UDP数据报使用无效的IP源地址&#xff08;例如广播或多播地址&#xff09;时&#xff0c;是否被UDP或IP层丢弃。 描述&#xff1a; 本测试用例旨在确保当接收到一个源地址为多播地址的UDP数据报时&#xff0c;UDP或IP层能够正确地将其丢弃&#…

cv 笔记10 canvas在线绘图

相关内容&#xff1a;绘点、直线、矩形、圆形、颜色代码及取色网站、渐变填充、…… HTML5新增了canvas标记&#xff0c;不需要任何插件&#xff0c;就可以在网页上绘图&#xff0c;简单来说&#xff0c;canvas就像一块绘图板一样&#xff0c;而画笔就是JavaScript语句&#xf…

从一到无穷大 #25 DataFusion:可嵌入,可扩展的模块化工业级计算引擎实现

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言架构总览与可扩展性Catalog and Data SourcesFront End逻辑计划与逻辑计划优化器…