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

力扣 Hot 100 刷题记录 - 二叉搜索树中第 K 小的元素

力扣 Hot 100 刷题记录 - 二叉搜索树中第 K 小的元素

题目描述

二叉搜索树中第 K 小的元素 是力扣 Hot 100 中的一道经典题目,题目要求如下:

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

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

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


解题思路

二叉搜索树(BST)的性质是 中序遍历结果为升序序列。因此,可以通过中序遍历找到第 k 小的元素。

方法一:递归中序遍历

  • 对 BST 进行中序遍历,记录遍历结果。
  • 返回第 k 个元素。

方法二:迭代中序遍历

  • 使用栈模拟中序遍历,避免递归调用栈的开销。
  • 在遍历过程中直接找到第 k 小的元素。

C++ 代码实现

方法一:递归中序遍历

/**
 * 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 kthSmallest(TreeNode* root, int k) {
        vector<int> inorder_result;
        inorder(root, inorder_result); // 中序遍历
        return inorder_result[k - 1]; // 返回第 k 小的元素
    }

private:
    void inorder(TreeNode* root, vector<int>& result) {
        if (!root) return; // 递归终止条件

        inorder(root->left, result);  // 遍历左子树
        result.push_back(root->val); // 访问根节点
        inorder(root->right, result); // 遍历右子树
    }
};

方法一:递归中序遍历

#include <stack>

class Solution {
public:
    int kthSmallest(TreeNode* root, int k) {
        stack<TreeNode*> stk;
        TreeNode* curr = root;

        while (curr || !stk.empty()) {
            // 遍历左子树
            while (curr) {
                stk.push(curr);
                curr = curr->left;
            }

            // 访问根节点
            curr = stk.top();
            stk.pop();
            if (--k == 0) return curr->val; // 找到第 k 小的元素

            // 遍历右子树
            curr = curr->right;
        }

        return -1; // 未找到(正常情况下不会执行到这里)
    }
};
http://www.dtcms.com/a/81039.html

相关文章:

  • Rust与Java对比
  • 【redis】AOF 的基本工作机制,顺序写入,文件同步,重写机制
  • lunar是一款无第三方依赖的公历 python调用
  • OSCP - Proving Grounds- CVE-2023-46818
  • 5-1 使用ECharts将MySQL数据库中的数据可视化
  • NLua 文档
  • Facebook的社交媒体伦理:信息传播与责任的平衡
  • Java集成MQTT和Kafka实现稳定、可靠、高性能的物联网消息处理系统
  • C语言未定义的标识符怎么解决
  • [创业之路-340]:投资的本质:前人栽树后人乘凉。企业固定资产投资
  • 论文速递| ECG去噪新方法:小波+ CNN提升可穿戴精度
  • Uni-App 双栏联动滚动组件开发详解 (电梯导航)
  • 【JVM】性能监控与调优概述篇
  • 面试提问:数仓设计不分层可以吗?
  • 关于 51 单片机显示多个数码管时出现残影
  • 基于springboot的高校心理教育辅导系统(019)
  • Django之旅:第二节--启动运行django
  • ffmpeg+ubuntu编译库(完整版本)
  • 基于javaweb的SpringBoot时装购物系统设计与实现(源码+文档+部署讲解)
  • 常见业务分析模型
  • 3D开发工具HOOPS SDK:赋能CAM软件开发的利器
  • 美团Leaf分布式ID生成器:使用详解与核心原理解析
  • debian12运行sql server2022(docker):导入.MDF .LDF文件到容器
  • PHP与Python无缝融合,开启跨语言开发新纪元
  • 内网安全-横向移动Kerberos 攻击SPN 扫描WinRMWinRSRDP
  • C++ std::bitset
  • 【MyDB】5-索引管理之4-单元测试
  • 详解string类+迭代器
  • 【万字总结】前端全方位性能优化指南(二)——AVIF/WebP格式转换、渐进式加载、WASM解码加速
  • 【存储中间件】Redis核心技术与实战(四):Redis高并发高可用(Redis集群介绍与搭建)