题目
给定一个二叉搜索树的根节点 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
分析
二叉搜索树(BST)的一个重要特性是中序遍历的结果是一个有序序列,利用这个特性可以找出第 k
小的元素。
递归法
递归过程:
- 递归调用
inorder
函数遍历左子树。 - 每次访问一个节点时,
count
加 1。 - 当
count
等于k
时,说明找到了第k
小的元素,将该节点的值赋给result
并返回。 - 递归调用
inorder
函数遍历右子树。
时间复杂度:O(),
是树的高度
空间复杂度:O()
cpp
class Solution {
private:
int count = 0;
int result = 0;
void inorder(TreeNode* node, int k) {
if (!node) return;
// 先遍历左子树
inorder(node->left, k);
// 计数器加 1
count++;
if (count == k) {
result = node->val;
return;
}
// 再遍历右子树
inorder(node->right, k);
}
public:
int kthSmallest(TreeNode* root, int k) {
inorder(root, k);
return result;
}
};