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);
    }
};
相关推荐
淡海水2 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan3 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy3 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息4 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
kiracrimson5 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
木井巳6 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊6 小时前
归并排序之翻转对(hard)
数据结构·算法
白山编程大哥6 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
_Twink1e6 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
shehuiyuelaiyuehao6 小时前
算法34,位运算符操作,总结
算法