leetcode:230. 二叉搜索树中第K小的元素

题目

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

示例 1:
[中等] 230. 二叉搜索树中第K小的元素 - 图1

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

示例 2:
[中等] 230. 二叉搜索树中第K小的元素 - 图2

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

解答 & 代码

二叉搜索树中序遍历得到的是递增序列,因此在中序遍历的过程中额外使用一个变量 cnt 记录当前是第几个被访问的节点,如果 cnt==k,则当前节点的值就是二叉搜索树中第 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. private:
  14. int cnt = 0; // 代表当前遍历的是第几个节点
  15. int kthVal = -1; // 二叉搜索树中第 k 小的元素
  16. // 递归中序遍历
  17. void dfs(TreeNode* root, int k)
  18. {
  19. if(root == nullptr)
  20. return;
  21. dfs(root->left, k); // 递归处理左子树
  22. // 中序位置:如果当前是遍历到的第 k 个节点,则当前节点的值就是第 k 小的元素,直接返回
  23. ++cnt;
  24. if(cnt == k)
  25. {
  26. kthVal = root->val;
  27. return;
  28. }
  29. dfs(root->right, k); // 递归处理右子树
  30. }
  31. public:
  32. int kthSmallest(TreeNode* root, int k) {
  33. dfs(root, k);
  34. return kthVal;
  35. }
  36. };

复杂度分析:设二叉树共 N 个节点

  • 时间复杂度 O(N):遍历每个节点一次
  • 空间复杂度 O(log N):栈空间取决于递归深度,即二叉树的高度

执行结果:

  1. 执行结果:通过
  2. 执行用时:12 ms, 在所有 C++ 提交中击败了 91.54% 的用户
  3. 内存消耗:23.5 MB, 在所有 C++ 提交中击败了 62.34% 的用户