输入: 二叉搜索树根节点 root,整数 k(从 1 开始计数)。
要求: 返回 BST 中第 k 小的元素。
输出: 一个整数(第 k 小的节点值)。
思路:
BST + 中序遍历 的经典应用:
BST 的中序遍历结果是严格递增序列,所以“第 k 小” = “中序遍历第 k 个访问到的节点”。
-
用
k作为计数器(引用传递)
中序遍历每访问一个节点就--k,当k == 0时当前节点值就是答案。 -
提前结束遍历(剪枝)
递归函数返回bool:true表示已经找到答案,沿递归栈一路返回,不再继续遍历右子树/后续节点。
这样避免无意义的遍历,尤其当k很小的时候很省事。
复杂度:
- 时间复杂度:O(H + k)(最坏 O(N))
走到最左边需要 O(H),然后访问到第 k 个需要 O(k)。极端情况下退化到 O(N)。 - 空间复杂度:O(H)
递归栈深度等于树高。
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
ans = -1;
inorder(root, k);
return ans;
}
private:
int ans;
// 返回 true 表示已经找到答案,后续直接提前结束
bool inorder(TreeNode* node, int& k) {
if (!node) return false;
if (inorder(node->left, k)) return true;
if (--k == 0) {
ans = node->val;
return true;
}
return inorder(node->right, k);
}
};
1490

被折叠的 条评论
为什么被折叠?



