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

LeetCode-hot100——​二叉搜索树中第k小的元素​

题目

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

题目分析

  1. 题目要求:给定二叉搜索树的根节点 root 和整数 k,查找其中第 k 小的元素(从 1 开始计数)。
  2. 二叉搜索树特性:二叉搜索树的中序遍历结果是升序排列的。这一关键特性是解决本题的核心依据,因为中序遍历能按从小到大的顺序访问树中所有节点,所以第 k 个被访问的节点值就是第 k 小的元素。
  3. 示例理解:以示例 1 为例,输入的二叉搜索树结构为根节点是 3,左子节点是 1,1 的右子节点是 2,3 的右子节点是 4。中序遍历顺序为 1、2、3、4,当 k = 1 时,第一个被访问的节点值 1 就是输出结果。

解题思路

利用二叉搜索树中序遍历升序的特性,通过迭代法(栈模拟)实现中序遍历,在遍历过程中计数,当计数到 k 时,对应的节点值即为所求。

代码实现

class Solution {
public:int kthSmallest(TreeNode* root, int k) {stack<TreeNode*> ST;// 循环条件:root 不为空 或 栈不为空,确保遍历完整棵树while (root != nullptr || !ST.empty()) {// 第一步:将当前节点的所有左子节点入栈,遍历左子树while (root != nullptr) {ST.push(root);root = root->left;}// 第二步:弹出栈顶元素,处理当前节点(中序遍历的中间节点)root = ST.top();ST.pop();// 计数减一,判断是否找到第 k 小元素--k;if (k == 0) {break; // 找到第 k 小元素,跳出循环}// 第三步:遍历右子树root = root->right;}return root->val; // 返回第 k 小元素的值}
};

解释说明:

  1. 栈的作用:用于模拟中序遍历的递归过程,存储待处理的节点。
  2. 遍历左子树:通过 while (root != nullptr) 循环,将当前节点及其所有左子节点依次入栈,这一步是为了找到当前子树中最左的节点(中序遍历的第一个节点)。
  3. 处理当前节点:弹出栈顶元素(即当前子树的最左节点),此时对该节点进行 “访问”(这里的访问就是计数判断是否为第 k 小元素)。
  4. 遍历右子树:处理完当前节点后,将 root 指向其右子节点,继续中序遍历的过程(因为中序遍历顺序是左 - 根 - 右)。

样例演示:

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

初始状态root = 5,栈 ST 为空,k = 3

第 1 次进入外层循环

  • 目标:遍历左子树,将所有左节点入栈。

  • 内层循环(遍历左子树)

    • root = 5 入栈 → ST: [5]root 指向左子节点 3
    • root = 3 入栈 → ST: [5, 3]root 指向左子节点 2
    • root = 2 入栈 → ST: [5, 3, 2]root 指向左子节点 1
    • root = 1 入栈 → ST: [5, 3, 2, 1]root 指向左子节点 nullptr(内层循环结束)。
  • 处理栈顶节点

    • 弹出 1 → ST: [5, 3, 2]root = 1
    • k 减为 2(未到 0,继续)。
    • root 指向右子节点 nullptr(1 的右子树为空)。

第 2 次进入外层循环

  • 目标:栈非空(ST: [5, 3, 2]),继续处理。

  • 内层循环root 为 nullptr,不执行。

  • 处理栈顶节点

    • 弹出 2 → ST: [5, 3]root = 2
    • k 减为 1(未到 0,继续)。
    • root 指向右子节点 nullptr(2 的右子树为空)。

第 3 次进入外层循环

  • 目标:栈非空(ST: [5, 3]),继续处理。

  • 内层循环root 为 nullptr,不执行。

  • 处理栈顶节点

    • 弹出 3 → ST: [5]root = 3
    • k 减为 0(满足条件,跳出循环)。

最终结果:返回 root->val = 3,即第 3 小的元素。

递归解法:

递归代码:

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

这种解法比较提倡,后续二叉树的题解里面,我会经常用到,也是非常巧妙的解法!

http://www.dtcms.com/a/441714.html

相关文章:

  • 算法基础 典型题 单调栈
  • 人工智能赋能传统医疗设施设备改造:路径、挑战与未来展望
  • 【Java】杨辉三角、洗牌算法
  • 密码学中的Salt
  • 嵌入式硬件——基于IMX6ULL的GPT(通用定时器)实现
  • 东莞 营销网站建设互动网站如何做
  • 【pytest】使用 marker 向 fixture 传递数据
  • 从0死磕全栈之Next.js 中间件(Middleware)详解与实战
  • 用个人电脑做服务器建网站天门市基础建设网站
  • 分布式专题——26 BIO、NIO编程与直接内存、零拷贝深入辨析
  • Redisson分布式限流
  • 计算机网络-应用层协议原理
  • 分布式文件存储系统FastDFS(入门)
  • 电机控制-PMSM无感FOC控制(五)相电流检测及重构 — 单电阻采样
  • C语言底层学习(4.数据在内存中的存储)
  • 虚幻引擎UE5专用服务器游戏开发-33 在上半身播放组合蒙太奇
  • 织梦网站栏目访问目录做网站建设哪家效益快
  • 『数据结构』消失的数字
  • 鹤山网站建设易搜互联湖南seo
  • ORB_SLAM2原理及代码解析:Tracking::CreateInitialMapMonocular() 函数
  • 【Linux】System V —— 基于建造者模式的信号量
  • VScode-ESP-IDF工程函数定义无法跳转且无注释提示
  • 最新的网站建设软件标书制作员工作内容
  • JAVA SE 基础语法 —— C / 运算符
  • SSM餐饮管理系统uto0o《开发全资源(程序 / 源码 / 数据库)+ 万言论文(文末)+ 系统界面》
  • 上饶市建设厅网站中国最新消息新冠疫苗最新消息
  • 安徽省建设银行网站关于网站建设的意见
  • 免费域名建站青岛网站有限公司
  • 广东泰通建设有限公司网站东莞人才网58
  • 什么是wap网站甘家口网站建设