当前位置: 首页 > news >正文

Leetcode 热题100之二叉树2

1.二叉树的层序遍历

在这里插入图片描述
思路分析:层序遍历是逐层从左到右访问二叉树的所有节点,通常可以使用广度优先搜索(BFS)来实现。我们可以使用一个队列(FIFO)来存储每一层的节点,并逐层访问。

  • 初始化队列:将根节点放入队列中。如果根节点为空,则返回空结果;
  • 层级遍历:当队列不为空时,表示还有节点需要访问,每次处理一层
    • 获取当前层的节点数量‘
    • 遍历当前层的所有节点,将节点值存入结果列表;
    • 将当前节点的左右节点加入队列,供下一层使用;
  • 返回结果:将每一层的节点值依次存入结果列表并返回。

具体实现代码(详解版):

/*** 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>> result;//存储层序遍历结果if(root == nullptr) return result;//空树queue<TreeNode*> q;//队列用于广度优先搜索q.push(root);while(!q.empty()){int levelSize = q.size();//当前层的节点梳理vector<int> currentLevel;//存储当前层的节点值for(int i = 0 ; i < levelSize ; i ++){TreeNode* node = q.front();//取出队首节点q.pop();//移除队首节点currentLevel.push_back(node->val);//添加当前节点的值道当前层//将左右子节点加入队列,供下一层访问if(node->left) q.push(node->left);if(node->right) q.push(node->right);}result.push_back(currentLevel);//将当前层加入结果}return result;}
};
  • 时间复杂度:O(n),其中n是节点总数。每个节点访问一次
  • 空间复杂度:O(n),队列在最坏情况下可能会存储所有叶节点。

2.将有序数组转化为二叉搜索树

在这里插入图片描述
思路分析:将一个已排序的整数数组转换为平衡的二叉搜索树(BST)可以通过递归的方法完成。这个问题的关键在于,平衡的二叉搜索树要求左右子树的高度差不超过 1,这可以通过将数组的中间元素作为根节点来实现,左半部分构成左子树,右半部分构成右子树。这样递归下去,可以构造出一个平衡的 BST。

  • 选择中间元素:为了让树平衡,应该选择数组的中间元素作为根节点;
  • 递归构建左右子树:将左半部分的数组递归构建左子树,右半部分的数组递归构建为右子树。
  • 终止条件:当子数组为空时,返回nullptr。

具体实现代码(详解版):

// 辅助函数:递归构建平衡二叉搜索树
TreeNode* buildBST(const vector<int>& nums, int left, int right) {// 终止条件:当左边界超过右边界时,返回空指针if (left > right) return nullptr;// 选择中间元素作为根节点int mid = left + (right - left) / 2;TreeNode* root = new TreeNode(nums[mid]);// 递归构建左子树root->left = buildBST(nums, left, mid - 1);// 递归构建右子树root->right = buildBST(nums, mid + 1, right);// 返回当前子树的根节点return root;
}// 主函数:将排序数组转换为平衡二叉搜索树
TreeNode* sortedArrayToBST(vector<int>& nums) {return buildBST(nums, 0, nums.size() - 1);
}
  • 时间复杂度:O(n),其在n是数组的长度。每个元素仅访问一次,用于构建树节点;
  • 空间复杂度:O(log n),因为递归深度与树的高度相干。对于平衡的二叉树,高度约为log(n)。

3.验证二叉搜索树

在这里插入图片描述
思路分析:
要判断一个二叉树是否是有效的二叉搜索树(BST),可以利用 BST 的性质:

  • 左子树的所有节点值必须小于当前节点的值。
  • 右子树的所有节点值必须大于当前节点的值。

我们可以通过递归来检查每个节点是否满足这个条件。在递归过程中,为每个节点维护一个允许的值范围(最小值和最大值)。对于当前节点:

  • 左子节点的值应该小于当前节点的值,且在当前的最小值到当前节点值的范围内。
  • 右子节点的值应该大于当前节点的值,且在当前节点值到当前的最大值范围内。

实现思路:

  • 递归检查节点范围:在递归中为每一个节点维护一个值范围;
  • 检查左右子树:在每次递归时,左子树的最大值更新为当前节点的值,右子树的最小住更新为当前节点的值;
  • 终止条件:如果节点为空,返回true;如果节点值不在指定的范围内,返回false;
/*** 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 isValidBST(TreeNode* node , long long minVal , long long maxVal){if(node == nullptr) return true;//检查当前节点是否在允许的范围内if(node->val <= minVal || node->val >= maxVal) return false;//递归检测左子树和右子树//左子树的最大值更新为当前节点的值//右子树的最小值更新为当前节点的值return isValidBST(node->left,minVal,node->val)&& isValidBST(node->right,node->val,maxVal);}bool isValidBST(TreeNode* root) {return isValidBST(root,LONG_LONG_MIN,LONG_LONG_MAX);}
};
  • 时间复杂度:O(n),其中n是节点总数,每个节点访问一次;
  • 空间复杂度:O(h),其在h是树的高度。

4.二叉搜索树中第k小的元素

在这里插入图片描述
思路分析:在二叉搜索树(BST)中,第 k 小的元素可以通过 中序遍历获得,因为中序遍历的结果是按升序排列的。在中序遍历中,只需计数到第 k 个节点即可找到所需的元素。

  • 中序遍历:由于二叉搜索树的性质,中序遍历(左根右)会以升序遍历节点;
  • 计数节点:在中序遍历时,每访问一个节点,增加计数器。当计数器等于k时,当前节点即为第k小的节点
  • 剪枝:当找到第k小的节点后,可以停止遍历,节省不必要的运算。

具体实现代码(详解版):

class Solution {
public:int result = 0;//存储结果int count = 0;//计数器//中序遍历void inorder(TreeNode* node,int k){if(node == nullptr) return;//遍历左子树inorder(node->left,k);//访问当前节点count ++;if(count == k){result = node->val;return;}//遍历右子树inorder(node->right,k);}int kthSmallest(TreeNode* root, int k) {inorder(root,k);return result;}
};
  • 时间复杂度:O(h+k),其中h是树的高度,最坏情况下需要遍历k个节点;
  • 空间复杂度:O(h),递归调用栈的最大深度和树的高度成正比。

5.二叉树的右视图

在这里插入图片描述
思路分析:要从二叉树的右侧查看节点值,可以使用 层序遍历,即逐层遍历二叉树。对于每一层的最右侧节点,将其加入结果列表。我们可以通过 广度优先搜索(BFS) 来实现该过程,因为 BFS 可以方便地按层处理节点。

  • 层序遍历:使用队列进行广度优先搜索,从根节点开始按层遍历树;
  • 记录每层的最右节点:在遍历每一层的节点时,最后一个访问的节点即为该层的最右侧接待你,将其添加到结果中;
  • 继续下一层:继续处理下一层,知道所有节点都被遍历完。

具体实现代码(详解版):

class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<int> result;  // 存储右视图的结果if (root == nullptr) return result;  // 如果根节点为空,返回空的结果queue<TreeNode*> q;  // 创建一个队列,用于层序遍历二叉树q.push(root);  // 将根节点加入队列,开始层序遍历// 循环,直到队列为空while (!q.empty()) {int levelSize = q.size();  // 当前层的节点数TreeNode* currentNode;// 遍历当前层的所有节点for (int i = 0; i < levelSize; ++i) {currentNode = q.front();  // 获取队首节点q.pop();  // 弹出队首节点// 如果存在左子节点,则将其加入队列if (currentNode->left) q.push(currentNode->left);// 如果存在右子节点,则将其加入队列if (currentNode->right) q.push(currentNode->right);}// 当前层的最后一个节点是从右侧可以看到的节点,将其值加入结果result.push_back(currentNode->val);}return result;  // 返回右视图的结果}
};
  • 时间复杂度:O(n),其中n是二叉树的节点数,每个节点都被访问一次;
  • 空间复杂度:O(d),其中d是二叉树的最大宽度。

相关文章:

Leetcode 热题100之二叉树2

1.二叉树的层序遍历 思路分析&#xff1a;层序遍历是逐层从左到右访问二叉树的所有节点&#xff0c;通常可以使用广度优先搜索&#xff08;BFS&#xff09;来实现。我们可以使用一个队列&#xff08;FIFO&#xff09;来存储每一层的节点&#xff0c;并逐层访问。 初始化队列&a…...

<项目代码>YOLOv8 煤矸石识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…...

GA/T1400视图库平台EasyCVR视频分析设备平台微信H5小程序:智能视频监控的新篇章

GA/T1400视图库平台EasyCVR是一款综合性的视频管理工具&#xff0c;它兼容Windows、Linux&#xff08;包括CentOS和Ubuntu&#xff09;以及国产操作系统。这个平台不仅能够接入多种协议&#xff0c;还能将不同格式的视频数据统一转换为标准化的视频流&#xff0c;通过无需插件的…...

LVM与磁盘配额

文章目录 LVM与磁盘配额1 LVM概述1.1 名词解释1.2 LVM优势 2 LVM相关命令2.1 创建逻辑卷过程2.2 对逻辑卷扩容 3 磁盘配额3.1 磁盘配额的特点3.2 磁盘配额的命令3.3 查看配额使用情况3.4 验证磁盘配额3.5 实验 LVM与磁盘配额 1 LVM概述 1.1 名词解释 LVM&#xff1a;logical…...

xmuoj [蒙德里安的梦想] 状压dp个人笔记

本题是状压dp经典题目&#xff0c;很多人都是通过这一题开始对状压dp有所了解。 在进行讲解之前&#xff0c;我们先通过几个问答大致了解状压dp。 一、问答 1. 问题&#xff1a;什么是状压dp? 回答&#xff1a;状压dp即为状态压缩动态规划&#xff0c;何为状态压缩&#x…...

ubuntu22安装搜狗输入法不能输入中文

关闭Wayland 在/etc/gdm3/custom.conf文件内&#xff0c;取消注释WaylandEnable cat /etc/gdm3/custom.conf | grep WaylandEnable WaylandEnablefalse 其它步骤参考搜狗官方教程 https://pinyin.sogou.com/linux/help.php...

HtmlAgilityPack 操作详解

目录 1.安装 HtmlAgilityPack 2. 示例 HTML 3. 使用 HtmlAgilityPack 进行 HTML 解析与操作 4. 代码详解 1.加载html文档 2.选择元素 3. 提取属性 4.修改属性 5.常用的几种获取元素的 XPath 写法 HtmlAgilityPack&#xff1a; 轻量且高效&#xff0c;适合进行常规的 H…...

基于SSM医院门诊互联电子病历管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;医生管理&#xff0c;项目分类管理&#xff0c;项目信息管理&#xff0c;预约信息管理&#xff0c;检查信息管理&#xff0c;系统管理 用户账号功能包括&#xff1a;系统首页&…...

【读书笔记/深入理解K8S】集群网络

前言 上一章讲了集群控制器的一个大概的原理&#xff0c;这一章讲一下集群网络。网络是集群通信的载体&#xff0c;因为该书是阿里云团队出品的&#xff0c;所以也以阿里云的集群网络方案为例&#xff0c;其他云厂商的网络集群方案一般来说也大同小异。所以通过本章的学习&…...

【专有网络VPC】连接公网

通过ECS实例固定公网IP、弹性公网IP、NAT网关、负载均衡使专有网络中的云资源可以访问公网&#xff08;Internet&#xff09;或被公网访问。 概述 专有网络是您自定义的云上私有网络。专有网络中的云资源默认无法访问公网&#xff0c;也无法被公网访问。您可以通过配置ECS实例…...

论文 | Legal Prompt Engineering for Multilingual Legal Judgement Prediction

这篇文章探讨了如何利用“法律提示工程”&#xff08;LPE&#xff09;来指导大型语言模型&#xff08;LLM&#xff09;进行多语言法律判决预测&#xff08;LJP&#xff09;。主要内容&#xff1a; LPE 的概念&#xff1a; LPE 是指通过设计特定的提示&#xff08;promp…...

国科安芯抗辐照MCU和CANFD芯片发布

国科安芯科技有限公司近期发布了两款重要的芯片产品&#xff1a;抗辐照MCU芯片和抗辐照CANFD芯片。这两款芯片的发布标志着国科安芯在高性能、高安全性芯片产品研制方面取得了显著进展&#xff0c;特别是在抗辐照技术领域。 1. 抗辐照MCU芯片&#xff1a;国科安芯研发的AS32A4…...

C++ 并发专题 - 无锁数据结构(概述)

一&#xff1a;概述&#xff1a; 无锁数据结构是一种在多线程环境中实现线程安全的结构&#xff0c;它允许多个线程在没有传统锁机制的情况下并发访问和修改数据。这种设计的目标是提高程序的性能和响应性&#xff0c;避免锁竞争和上下文切换的开销。 二&#xff1a;原理&…...

NLP领域的经典算法和模型

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;经典算法和模型众多&#xff0c;它们在不同任务中发挥着重要作用。以下是一些NLP领域的经典算法和模型的详细介绍&#xff1a; 一、基础模型 词袋模型&#xff08;Bag of Words&#xff0c;BoW&#xff09; 原理&a…...

提升安全上网体验:Windows 11 启用 DOH(阿里公共DNS)

文章目录 阿里公共 DNS 介绍免费开通云解析 DNS 服务Windows 编辑 DNS 设置配置 IPv4配置 IPv6 路由器配置 DNS 阿里公共 DNS 介绍 https://alidns.com/ 免费开通云解析 DNS 服务 https://dnsnext.console.aliyun.com/pubDNS 开通服务后&#xff0c;获取 DOH 模板&#xff0…...

论文概览 |《Journal of Transport Geography》2024.10 Vol.120

本次给大家整理的是《Journal of Transport Geography》杂志2024年9月第120卷的论文的题目和摘要&#xff0c;一共包括17篇SCI论文&#xff01; 论文1 Modelling scenarios in planning for future employment growth in Stockholm 斯德哥尔摩未来就业增长规划情景建模 【摘要…...

yum不能使用: cannot find a valid baseurl for repo: base/7/x86_64

使用yum命令时报错&#xff1a; 原因&#xff1a; CentOS 已经停止维护的问题。2020 年 12 月 8 号&#xff0c;CentOS 官方宣布了停止维护 CentOS Linux 的计划&#xff0c;并推出了 CentOS Stream 项目&#xff0c;CentOS Linux 8 作为 RHEL 8 的复刻版本&#xff0c;生命周期…...

什么品牌的护眼台灯比较好?五款护眼效果比较明显的护眼台灯

在当今信息爆炸的时代背景下&#xff0c;挑选一款真正符合个人需求的护眼台灯&#xff0c;确实是一项不小的挑战。市场上品牌众多、型号繁杂&#xff0c;功能特点各不相同&#xff0c;价格区间也相当广泛&#xff0c;许多消费者在选购时往往感到迷茫不已。当大家询问“什么品牌…...

HTML 表单设计与验证

创建 HTML 表单的步骤如下&#xff1a; 使用 <form> 标签来创建表单&#xff0c;<form> 标签有一个 action 属性&#xff0c;用于指定表单提交的目标 URL。 在 <form> 标签内部&#xff0c;使用 <input> 标签来创建输入框。<input> 标签有一个 …...

qt QDialog详解

1、概述 QDialog是Qt框架中用于创建对话框的类&#xff0c;它继承自QWidget。QDialog提供了一个模态或非模态的对话框&#xff0c;用于与用户进行交互。模态对话框会阻塞其他窗口的输入&#xff0c;直到用户关闭该对话框&#xff1b;而非模态对话框则允许用户同时与多个窗口进…...

Spring Boot + Thymeleaf 防重复提交

在 Spring Boot 与 Thymeleaf 结合的 Web 应用中&#xff0c;防止重复提交可以采用token 机制 客户端禁用按钮的方式实现&#xff0c;在高并发场景下&#xff0c;考虑使用 Redis 存储 token 而非 Session。 第一步&#xff1a;后端实现 Controller public class FormControl…...

服务器中僵尸网络攻击是指什么?

随着网络业务的不断发展&#xff0c;网络攻击的手段也变得越来越多&#xff0c;各个企业都会受到网络攻击的威胁&#xff0c;其中常见的网络攻击主要有DDOS攻击和CC攻击等类型&#xff0c;今天小编则为大家来介绍僵尸网络攻击是指什么&#xff01; 僵尸网络主要是指采用一种或者…...

Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程ES(三)

DSL官方地址&#xff1a; DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;https://www.elastic.co/docs/explore-analyze/query-filter/languages/querydsl&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0…...

AI数据分析在体育中的应用:技术与实践

在现代体育竞技领域&#xff0c;"数据驱动"已不再是一个遥远的概念。尤其随着人工智能&#xff08;AI&#xff09;和大数据分析的不断成熟&#xff0c;从职业俱乐部到赛事直播平台&#xff0c;从运动员训练到球迷观赛体验&#xff0c;AI正以前所未有的方式渗透并改变…...

零基础入门 C 语言基础知识(含面试题):结构体、联合体、枚举、链表、环形队列、指针全解析!

&#x1f31f; 零基础入门 C 语言基础知识&#xff08;含面试题&#xff09;&#xff1a;结构体、联合体、枚举、链表、环形队列、指针全解析&#xff01; C 语言是所有程序员通向“系统世界”的第一把钥匙。很多嵌入式开发、操作系统内核、网络通信、图形引擎&#xff0c;背后…...

在 Android Studio 中使用 GitLab 添加图片到 README.md

1. 将图片文件添加到项目中 在项目根目录下创建一个 images 或 assets 文件夹 将你的图片文件&#xff08;如 screenshot.png&#xff09;复制到这个文件夹中 2. 跟提交项目一样&#xff0c;提交图片到 GitLab 在 Android Studio 的 Git 工具窗口中&#xff1a; 右键点击图片…...

深度学习登上Nature子刊!特征选择创新思路

2025深度学习发论文&模型涨点之——特征选择 特征选择作为机器学习与数据挖掘领域的核心预处理步骤&#xff0c;其重要性在当今高维数据时代日益凸显。 通过识别最具判别性的特征子集&#xff0c;特征选择算法能够有效缓解"维度灾难"、提升模型泛化能力&#x…...

UOS 20 Pro为国际版WPS设置中文菜单

UOS 20 Pro为国际版WPS设置中文菜单 查看UOS操作系统系统安装国际版wps并汉化方法1:下载zh_CN.tar.gz语言包方法2&#xff1a;手动从国内版wps12的包中提取中文菜单解压国内版wps的包 复制中文语言包到wps国际版目录下安装Windows字体 安装开源office 查看UOS操作系统系统 # 查…...

AI是如何换装的?

AI换装是一种基于计算机视觉、深度学习和生成对抗网络(GAN)的技术,能够通过算法自动识别人像并更换服饰,实现虚拟换装的效果。这项技术广泛应用于电商服装试穿、虚拟偶像、影视特效、社交媒体滤镜等领域。 AI换装的核心技术 1. 图像分割与人体解析 换装的第一步是图像分…...

多标签多分类 用什么函数激活

在多标签多分类任务中&#xff0c;激活函数的选择需要根据任务特性和输出层的设计来决定。以下是常见的激活函数及其适用场景&#xff1a; 一、多标签分类任务的特点 每个样本可以属于多个类别&#xff08;标签之间非互斥&#xff0c;例如一篇文章可能同时属于 “科技” 和 “…...