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

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

🚀核心逻辑

本解法采用 二叉搜索树的中序遍历 策略:

  1. 中序遍历特性:二叉搜索树的中序遍历结果是一个 严格递增 的序列。
  2. 操作流程
    • 进行中序遍历(左 -> 根 -> 右)。
    • 每访问一个节点(由小到大),计数器 count 减 1。
    • count 减到 0 时,当前节点的值就是第 k 小的元素,记录到 result 并返回。
  3. 剪枝优化:找到第 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

image-Pftg.png

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