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

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;}
};

相关文章:

  • 如何使用 Flutter 和地理位置 API 构建基于位置的移动应用程序?
  • 【前端】HTML5 CSS3新特性(学习笔记)
  • 12. IO
  • 2-2基础算法-递归/进制转换
  • mysql 与mssql 命令有那些区别
  • 【算法系列篇】递归、搜索和回溯(三)
  • HarmonyOS学习0基础版
  • 【深度学习】注意力机制(三)
  • weston 1: 编译与运行傻瓜教程(补充)
  • 【C语言】函数递归--输出n的k次方
  • 【Hive】
  • 智慧工地防盗新手段:TSINGSEE青犀工地智能监控防盗系统方案
  • 我的创作纪念日--第128天
  • 接口测试 — 3.Httpbin介绍(请求调试工具)
  • 要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 21 章:课程学习提示
  • 「译」Node.js Streams 基础
  • es6
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • js继承的实现方法
  • node入门
  • Unix命令
  • 初识 beanstalkd
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 机器学习学习笔记一
  • 将回调地狱按在地上摩擦的Promise
  • 前嗅ForeSpider采集配置界面介绍
  • 巧用 TypeScript (一)
  • 使用parted解决大于2T的磁盘分区
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微服务核心架构梳理
  • 我从编程教室毕业
  • 我有几个粽子,和一个故事
  • 学习使用ExpressJS 4.0中的新Router
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 06-01 点餐小程序前台界面搭建
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)斐波那契Fabonacci函数
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (十六)串口UART
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • .gitignore
  • .htaccess配置常用技巧
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇