题目链接

LeetCode

题目描述

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

示例 1:

230. 二叉搜索树中第K小的元素 - 图1

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

示例 2:

230. 二叉搜索树中第K小的元素 - 图2

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

提示:

  • 树中的节点数为 n
  • 1 <= k <= n <= 104
  • 0 <= Node.val <= 104

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

解题思路

方法一:中序遍历

中序遍历,并且记录每个遍历过的结点位置

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. int kthSmallest(TreeNode* root, int k) {
  15. recur(root,k);
  16. return res;
  17. }
  18. private:
  19. int pos = 0;
  20. int res = 0;
  21. void recur(TreeNode* root,int k){
  22. if(root==nullptr)
  23. return;
  24. recur(root->left,k);
  25. pos++;
  26. if(pos == k){
  27. res = root->val;
  28. return;
  29. }
  30. recur(root->right,k);
  31. }
  32. };
  • 时间复杂度 O(n)
  • 空间复杂度 O(1)