leetcode: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
解答 & 代码
二叉搜索树中序遍历得到的是递增序列,因此在中序遍历的过程中额外使用一个变量 cnt
记录当前是第几个被访问的节点,如果 cnt==k
,则当前节点的值就是二叉搜索树中第 k 小的元素
/**
* 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 {
private:
int cnt = 0; // 代表当前遍历的是第几个节点
int kthVal = -1; // 二叉搜索树中第 k 小的元素
// 递归中序遍历
void dfs(TreeNode* root, int k)
{
if(root == nullptr)
return;
dfs(root->left, k); // 递归处理左子树
// 中序位置:如果当前是遍历到的第 k 个节点,则当前节点的值就是第 k 小的元素,直接返回
++cnt;
if(cnt == k)
{
kthVal = root->val;
return;
}
dfs(root->right, k); // 递归处理右子树
}
public:
int kthSmallest(TreeNode* root, int k) {
dfs(root, k);
return kthVal;
}
};
复杂度分析:设二叉树共 N 个节点
- 时间复杂度 O(N):遍历每个节点一次
- 空间复杂度 O(log N):栈空间取决于递归深度,即二叉树的高度
执行结果:
执行结果:通过
执行用时:12 ms, 在所有 C++ 提交中击败了 91.54% 的用户
内存消耗:23.5 MB, 在所有 C++ 提交中击败了 62.34% 的用户