230. 二叉搜索树中第 K 小的元素
🚀核心逻辑
本解法采用 二叉搜索树的中序遍历 策略:
- 中序遍历特性:二叉搜索树的中序遍历结果是一个 严格递增 的序列。
- 操作流程:
- 进行中序遍历(左 -> 根 -> 右)。
- 每访问一个节点(由小到大),计数器
count减 1。 - 当
count减到 0 时,当前节点的值就是第k小的元素,记录到result并返回。
- 剪枝优化:找到第
k小的元素后立即返回,不再继续遍历,避免不必要的计算。
✨其实就打个比方,有一个有序数组,让你找第 k 小的元素,就很简单明了
🔥代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int count;
int result;
public int kthSmallest(TreeNode root, int k) {
count = k;
kthSmallestHelper(root);
return result;
}
public void kthSmallestHelper(TreeNode root) {
if (root == null) {
return;
}
// 左子树
kthSmallestHelper(root.left);
// 访问当前节点
count--;
if (count == 0) {
result = root.val;
return;
}
// 右子树
kthSmallestHelper(root.right);
}
}
📊复杂度分析
时间复杂度:
- O(N),其中 N 是二叉树的节点数。最坏情况下(k = N),需要遍历所有节点。
空间复杂度:
- O(H),其中 H 是二叉树的高度。最坏情况下(树为链状)递归深度为 N,空间复杂度为 O(N);最好情况下(平衡树)空间复杂度为 O(log N)
⚠️ 遇到的一些问题:
首先,思路是对的;中序遍历,升序寻找答案,并按此顺序让 k--,自下而上抛出这个 k 当 k 为0时说明当前节点值为答案
但是没有借助辅助方法,直接递归原方法,以为照样可以由底向上传回最底部修改后的k,殊不知犯了低级错误:
假设在A方法里递归了一次,为B方法,那么B中执行完把 k--, 随后回到A方法,A中d k 还是原来的 k ,因为修改的 k 是传入B时参数 k,不是修改的A中的参数 k,且思路本来就是错而乱d

解决办法:定义成员变量,定义辅助方法并递归,无需传参,即可