Leetcode230. 二叉搜索树中第K小的元素

题目

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

示例 1:

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

  3
 / \
1   4
 \
  2
输出: 1

示例 2:

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

       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 3

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

解题思路

由于这是二叉搜索树,中序遍历元素会从小到大排列,我们只需要进行中序遍历,并且用一个计数器统计到了第几个元素,再返回需要的结果即可。

C++解法

#include <iostream>
#include <vector>
#include <map>
#include <set>
using namespace std;
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
    int index = 0;
    int value = 0;
    int k = 0;
    int kthSmallest(TreeNode* root, int k) {
        index = 0;
        value = 0;
        this->k = k;
        search(root);
        return value;
    }
    
    void search(TreeNode * root) {
        if (root == NULL || index >= k) {return;}
        if (root->left) search(root->left);
        if (++index == k) { value = root->val; }
        if (root->right) search(root->right);
    }
};

int main(int argc, const char * argv[]) {
    // insert code here...
    Solution solution;
    cout << "Hello world" << endl;
    TreeNode * node = new TreeNode(5);
    node->left = new TreeNode(3);
    node->right = new TreeNode(6);
    node->left->left = new TreeNode(2);
    node->left->right = new TreeNode(4);
    node->left->left->left = new TreeNode(1);
    cout << solution.kthSmallest(node, 3) << endl;
    return 0;
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容