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

中序遍历 迭代

解题思路

  1. 迭代的方式进行中序遍历,定义一个次数 count ,每遍历一次 count++

  2. count === k 的时候,返回当前节点的值;

复杂度

  1. 时间复杂度:O(h+k),先到达叶子位置 h(最小节点位置),复杂度为 O(h),然后找到第 k 小的元素,复杂度为 O(k)

  2. 空间复杂度:O(h)

代码实现

var kthSmallest = function (root, k) {
    let count = 0;
    let stack = [];

    while (root || stack.length) {
        while (root) {
            stack.push(root);
            root = root.left;
        }
        root = stack.pop();
        count++;

        if (count === k) return root.val;

        root = root.right;
    }
};

中序遍历 递归

解题思路

  1. 递归遍历时计数,统计当前节点的序号;

  2. 递归到第 k 个节点时,应记录结果 res

  3. 记录结果后,后续的遍历即失去意义,应 提前返回

复杂度

  1. 时间复杂度:O(N),当树退化为链表,即全部为左子节点时,无论 k 的值大小,递归深度都为 N

  2. 空间复杂度:O(N),当树退化为链表时,系统使用 O(N) 大小的栈空间;

代码实现

let res, k;

var dfs = (root) => {
    if (root === null) return;

    dfs(root.left);
    if (k === 0) return; // 提前停止递归
    if (--k === 0) res = root.val;
    dfs(root.right);
};

var kthSmallest = function (root, target) {
    k = target;
    dfs(root);
    return res;
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 中序遍历 迭代
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现
  2. 2. 中序遍历 递归
    1. 2.1. 解题思路
    2. 2.2. 复杂度
    3. 2.3. 代码实现