230. 二叉搜索树中第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 <= 10^4
  • 0 <= Node.val <= 10^4

进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?

思路:

根据二叉搜索树的性质可知,其按照中序遍历序列可获得当前树的递增顺序序列。因此,通过递归中序遍历即可得到第K个元素的结果。

代码:

cpp 复制代码
/**
 * 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:
//根据二叉搜索树与中序遍历的性质得:二叉搜索树中第k个节点即为中序遍历序列的第k个节点
    int kthSmallest(TreeNode* root, int k) {
        this->k = k;
        inorderTravel(root);
        return res;
    }
private:
    int k;
    int index=0;
    int res=0;

private:
    void inorderTravel(TreeNode* root){
        if(root==nullptr) return;
        inorderTravel(root->left);
        index++;
        if(k == index){
            res = root->val;
            return;
        } 
        inorderTravel(root->right);
    }
};
相关推荐
智算菩萨7 分钟前
迷宫生成算法:从生成树到均匀随机,再到工程化 Python 实现
python·算法·游戏
醒过来摸鱼9 分钟前
《线性空间》专栏写作计划(目录)
算法
C雨后彩虹10 分钟前
幼儿园分班
java·数据结构·算法·华为·面试
Yupureki13 分钟前
《算法竞赛从入门到国奖》算法基础:入门篇-二分算法
c语言·开发语言·数据结构·c++·算法·visual studio
游戏23人生19 分钟前
c++ 语言教程——16面向对象设计模式(五)
开发语言·c++·设计模式
qq_4634084221 分钟前
React Native跨平台技术在开源鸿蒙中使用WebView来加载鸿蒙应用的网页版或通过一个WebView桥接本地代码与鸿蒙应用
javascript·算法·react native·react.js·开源·list·harmonyos
老王熬夜敲代码21 分钟前
C++的decltype
开发语言·c++·笔记
Jul1en_21 分钟前
【算法】位运算
算法
苏州知芯传感26 分钟前
柔性抓取的“慧眼”:MEMS 3D视觉如何让机器人精准识别无序堆叠的复杂钣金件?
算法·3d·机器人·mems
闻缺陷则喜何志丹29 分钟前
【C++组合数学】P8106 [Cnoi2021] 数学练习|普及+
c++·数学·洛谷·组合数学