当前位置: 首页 > 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; // 未找到(正常情况下不会执行到这里)
    }
};

相关文章:

  • 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时装购物系统设计与实现(源码+文档+部署讲解)
  • 常见业务分析模型
  • 上海青少年书法学习园开园:少年以巨笔书写《祖国万岁》
  • 中国旅马大熊猫“福娃”和“凤仪”启程回国
  • 特朗普:将于19日分别与普京和泽连斯基通话
  • 高途一季度净利润同比增长1108%: “与吴彦祖一起学英语”短时间内就实现了盈利
  • 泰山、华海、中路等山东险企综合成本率均超100%,承保业务均亏损
  • 占地57亩的“潮汕豪宅”面临强制拆除:曾被实施没收,8年间举行5次听证会