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

10.二叉搜索树中第k小的元素(medium)

1.题目链接:

230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode)230. 二叉搜索树中第 K 小的元素 - 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 示例 1:[https://assets.leetcode.com/uploads/2021/01/28/kthtree1.jpg]输入:root = [3,1,4,null,2], k = 1输出:1示例 2:[https://assets.leetcode.com/uploads/2021/01/28/kthtree2.jpg]输入:root = [5,3,6,2,4,null,null,1], k = 3输出:3  提示: * 树中的节点数为 n 。 * 1 <= k <= n <= 104 * 0 <= Node.val <= 104 进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?https://leetcode.cn/problems/kth-smallest-element-in-a-bst/description/2.题目描述:

给定一个二叉搜索树的根节点 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​

3. 解法二(中序遍历 + 计数器剪枝):​
算法思路:
上述解法不仅使用大量额外空间存储数据,并且会将所有的结点都遍历一遍。

但是,我们可以根据中序遍历的过程,只需扫描前 k 个结点即可。​
因此,我们可以创建一个全局的计数器 count,将其初始化为 k,每遍历一个节点就将 count--。直到某次递归的时候,count 的值等于 1,说明此时的结点就是我们要找的结果。​

算法流程:
1. 定义一个全局的变量 count,在主函数中初始化为 k 的值(不用全局也可以,当成参数传入递归过程中);
递归函数的设计:int dfs(TreeNode* root):​
返回值为第 k 个结点;​

递归函数流程(中序遍历):
1. 递归出口:空节点直接返回 -1,说明没有找到;​
2. 去左子树上查找结果,记为 retleft:​
         a. 如果 retleft == -1,说明没找到,继续执行下面逻辑;​
         b. 如果 retleft != -1,说明找到了,直接返回结果,无需执行下面代码(剪枝);

3. 如果左子树没找到,判断当前结点是否符合:
         a. 如果符合,直接返回结果
4. 如果当前结点不符合,去右子树上寻找结果。

Java算法代码:

class Solution {int count;int ret;public int kthSmallest(TreeNode root, int k) {count =k;dfs(root);return ret;}void dfs(TreeNode root){if(root == null || count ==0) return ;dfs(root.left);count--;if(count == 0 ) ret = root.val;if(count == 0) return;dfs(root.right);}
}

执行结果:

递归展开:这里有一个细节,按照笔者这里的展开,实际上是没有进行我们预期的那种减枝(读者可以仔细阅读)--- 在dfs左子树之后去添加if(count == 0)return;也可以进行减枝,本题中多次进行减枝,请好好体会。

逻辑展开:

这道题目,建议好好的研究一下怎么去减枝,这道题不能想到中序遍历。解决方法容易想到,但是这里减枝,你得自己手动画画,才能更好的理解。

---------------------------------------------------------------------------------------------------------------------------------

记住,相信你的递归函数,它可以做到!

记住,不理解时候,去尝试手动展开!

记住,逻辑展开(你不可能对所有的题目都进行手动展开)!

相关文章:

10.二叉搜索树中第k小的元素(medium)

1.题目链接&#xff1a; 230. 二叉搜索树中第 K 小的元素 - 力扣&#xff08;LeetCode&#xff09;230. 二叉搜索树中第 K 小的元素 - 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数…...

AlimaLinux设置静态IP

通过nmcli命令来操作 步骤 1&#xff1a;确认当前活动的网络接口名称 首先&#xff0c;需要确认当前系统中可用的网络接口名称。可以使用以下命令查看&#xff1a; nmcli device步骤 2&#xff1a;修改配置以匹配正确的接口名称 sudo nmcli connection modify ens160 ipv4.…...

滑动窗口——将x减到0的最小操作数

题目&#xff1a; 这个题如果我们直接去思考方法是很困难的&#xff0c;因为我们不知道下一步是在数组的左还是右操作才能使其最小。正难则反&#xff0c;思考一下&#xff0c;无论是怎么样的&#xff0c;最终这个数组都会分成三个部分左中右&#xff0c;而左右的组合就是我们…...

基于SpringBoot的抽奖系统测试报告

一、编写目的 本报告为抽奖系统测试报告&#xff0c;本项目可用于团体抽奖活动&#xff0c;包括了用户注册&#xff0c;用户登录&#xff0c;修改奖项以及抽奖等功能。 二、项目背景 抽奖系统采用前后端分离的方法来实现&#xff0c;同时使用了数据库来存储相关的数据&…...

服务器mysql连接我碰到的错误

搞了2个下午&#xff0c;总算成功了 我在服务器上使用docker部署了java项目与mysql&#xff0c;但mysql连接一直出现问题 1.首先&#xff0c;我使用的是localhost连接&#xff0c;心想反正都在服务器上吧。 jdbc:mysql://localhost:3306/fly-bird?useSSLfalse&serverTime…...

【Part 2安卓原生360°VR播放器开发实战】第四节|安卓VR播放器性能优化与设备适配

《VR 360全景视频开发》专栏 将带你深入探索从全景视频制作到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360全景视频制作与优化&#xff0c;以及高分辨率视频性能优化等实战技巧。 &#x1f4dd; 希望通过这个专栏&am…...

TIME - MoE 模型代码 4——Time-MoE-main/run_eval.py

源码&#xff1a;https://github.com/Time-MoE/Time-MoE 这段代码是一个用于评估 Time-MoE 模型性能的脚本&#xff0c;它支持分布式环境下的模型评估&#xff0c;通过计算 MSE 和 MAE 等指标来衡量模型在时间序列预测任务上的表现。代码的核心功能包括&#xff1a;模型加载、…...

数字孪生概念

数字孪生&#xff08;Digital Twin&#xff09; 是指通过数字技术对物理实体&#xff08;如设备、系统、流程或环境&#xff09;进行高保真建模和实时动态映射&#xff0c;实现虚实交互、仿真预测和优化决策的技术体系。它是工业4.0、智慧城市和数字化转型的核心技术之一。 1. …...

从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践

前言 从最初对人工智能的懵懂认知&#xff0c;到逐渐踏入Prompt工程的世界&#xff0c;我们一路探索&#xff0c;从私有化部署的实际场景&#xff0c;到对DeepSeek技术的全面解读&#xff0c;再逐步深入到NL2SQL、知识图谱构建、RAG知识库设计&#xff0c;以及ChatBI这些高阶应…...

DAMA车轮图

DAMA车轮图是国际数据管理协会&#xff08;DAMA International&#xff09;提出的数据管理知识体系&#xff08;DMBOK&#xff09;的图形化表示&#xff0c;它以车轮&#xff08;同心圆&#xff09;的形式展示了数据管理的核心领域及其相互关系。以下是基于用户提供的关键词对D…...

图形化编程革命:iVX携手AI 原生开发范式

一、技术核心&#xff1a;图形化编程的底层架构解析 1. 图形化开发的效率优势&#xff1a;代码量减少 72% 的秘密 传统文本编程存在显著的信息密度瓶颈。以 "按钮点击→条件判断→调用接口→弹窗反馈" 流程为例&#xff0c;Python 实现需定义函数、处理缩进并编写 …...

线程池使用ThreadLocal注意事项

ThreadLocal和线程池都是Java中处理多线程的重要工具&#xff0c;但它们在结合使用时需要特别注意一些问题。 ThreadLocal简介 ThreadLocal提供了线程局部变量&#xff0c;每个线程都有自己独立的变量副本&#xff0c;互不干扰。 基本用法&#xff1a; private static fina…...

JAVA EE_网络原理_网络层

晨雾散尽&#xff0c;花影清晰。 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ----------陳長生. ❀主页&#xff1a;陳長生.-CSDN博客❀ &#x1f4d5;上一篇&#xff1a;数据库Mysql_联…...

森林生态学研究深度解析:R语言入门、生物多样性分析、机器学习建模与群落稳定性评估

在生态学研究中&#xff0c;森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性&#xff0c;还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…...

AI大模型学习十八、利用Dify+deepseekR1 +本地部署Stable Diffusion搭建 AI 图片生成应用

一、说明 最近在学习Dify工作流的一些玩法&#xff0c;下面将介绍一下Dify Stable Diffusion实现文生图工作流的应用方法 Dify与Stable Diffusion的协同价值 Dify作为低代码AI开发平台的优势&#xff1a;可视化编排、API快速集成 Stable Diffusion的核心能力&#xff1a;高效…...

关于chatshare.xyz激活码使用说明和渠道指南!

chatshare.xyz和chatshare.biz是两个被比较的平台&#xff0c;分别在其功能特性和获取渠道有所不同。 本文旨在探讨它们的差异&#xff0c;以及提供如何获取并使用的平台信息。此外&#xff0c;还提及其他一些相关资源和模板推荐以满足用户需求。 主要区分关键点 1、chatshar…...

【Python-Day 12】Python列表进阶:玩转添加、删除、排序与列表推导式

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

RAII是什么?

RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;是C编程中的一项非常重要且经典的设计思想&#xff0c;也是现代C资源管理的基石。它主要解决资源的自动管理与释放问题&#xff0c;从而帮助程序员避免资源泄漏、悬空指针等常…...

Qt开发经验 --- 避坑指南(14)

文章目录 [toc]1 linux下使用linuxdeploy打包2 Qt源码下载3 QtCreator配置github copilot实现AI编程4 使用其它编程AI辅助开发Qt5 Qt开源UI库6 QT6.8以后版本安装QtWebEngine7 清除QtCreator配置 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发经验 &…...

JavaScript 循环语句全解析:选择最适合的遍历方式

循环是编程中处理重复任务的核心工具。JavaScript 提供了多种循环语句&#xff0c;每种都有其适用场景和独特优势。本文将深入解析 JavaScript 的 6 种核心循环语句&#xff0c;通过实际示例帮助你精准选择合适的循环方案。 一、基础循环三剑客 1. for 循环 经典索引控制 ja…...

MIT 6.S081 2020 Lab3 page tables 个人全流程

文章目录 零、写在前面1、关于页表2、RISC-V Rv39页表机制3、虚拟地址设计4、页表项设计5、访存流程6、xv6 的页表切换7、页表遍历 一、Print a page table1.1 说明1.2 实现 二、A kernel page table per process2.1 说明2.2 初始化 / 映射相关2.3 用户内核页表的创建和回收2.4…...

Oracle 通过 ROWID 批量更新表

Oracle 通过 ROWID 批量更新表 在 Oracle 数据库中&#xff0c;使用 ROWID 进行批量更新是一种高效的更新方法&#xff0c;因为它直接定位到物理行位置&#xff0c;避免了通过索引查找的开销。 ROWID 基本概念 ROWID 是 Oracle 数据库中每一行的唯一物理地址标识符&#xff…...

webpack 的工作流程

Webpack 的工作流程可以分为以下几个核心步骤&#xff0c;我将结合代码示例详细说明每个阶段的工作原理&#xff1a; 1. 初始化配置 Webpack 首先会读取配置文件&#xff08;默认 webpack.config.js&#xff09;&#xff0c;合并命令行参数和默认配置。 // webpack.config.js…...

tcpdump 的用法

tcpdump 是一款强大的命令行网络抓包工具&#xff0c;用于捕获和分析网络流量。以下是其核心用法指南&#xff1a; 一、基础命令格式 sudo tcpdump [选项] [过滤表达式]权限要求&#xff1a;需 root 权限&#xff08;使用 sudo&#xff09; 二、常用选项 选项说明-i <接口…...

Agent杂货铺

零散记录一些Agent相关的内容。不成体系&#xff0c;看情况是否整理 ReAct ReAct 是一种实践代理模型的高级框架&#xff0c;通过将大语言模型&#xff08;LLMs&#xff09;的推理和执行行动的能力结合起来&#xff0c;增强了它们在处理复杂任务时的决策能力、适应性和与外部…...

【Redis】Redis的主从复制

文章目录 1. 单点问题2. 主从模式2.1 建立复制2.2 断开复制 3. 拓扑结构3.1 三种结构3.2 数据同步3.3 复制流程3.3.1 psync运行流程3.3.2 全量复制3.3.3 部分复制3.3.4 实时复制 1. 单点问题 单点问题&#xff1a;某个服务器程序&#xff0c;只有一个节点&#xff08;只搞一个…...

第04章—技术突击篇:如何根据求职意向进行快速提升与复盘

经过上一讲的内容阐述后&#xff0c;咱们定好了一个与自身最匹配的期望薪资&#xff0c;接着又该如何准备呢&#xff1f; 很多人在准备时&#xff0c;通常会选择背面试八股文&#xff0c;这种做法效率的确很高&#xff0c;毕竟能在“八股文”上出现的题&#xff0c;也绝对是面…...

Quantum convolutional nerual network

一些问答 1.Convolution: Translationally Invariant Quasilocal Unitaries 理解&#xff1f; Convolution&#xff08;卷积&#xff09;&#xff1a; 在量子信息或量子多体系统中&#xff0c;"卷积"通常指一种分层、局部操作的结构&#xff0c;类似于经典卷积神经网…...

RL之ppo训练

又是一篇之前沉在草稿箱的文章&#xff0c;放出来^V^ PPO原理部分这两篇就够了&#xff1a; 图解大模型RLHF系列之&#xff1a;人人都能看懂的PPO原理与源码解读人人都能看懂的RL-PPO理论知识 那些你或多或少听过的名词 actor-critic: actor表示策略&#xff0c;critic表示价值…...

AI云防护真的可以防攻击?你的服务器用群联AI云防护吗?

1. 传统防御方案的局限性 静态规则缺陷&#xff1a;无法应对新型攻击模式&#xff08;如HTTP慢速攻击&#xff09;资源浪费&#xff1a;固定带宽采购导致非攻击期资源闲置 2. AI云防护技术实现 动态流量调度算法&#xff1a; # 智能节点选择伪代码&#xff08;参考群联防护…...