学习记录:js算法(五十五):二叉搜索树中第 K 小的元素

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

给定一个二叉搜索树的根节点 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

我的思路
递归
网上思路

我的思路

var kthSmallest = function(root, k) {
    let count = 0;
    let result = null;
    
    function inOrder(node) {
        if (node === null) return;
        
        inOrder(node.left);
        
        count++;
        if (count === k) {
            result = node.val;
            return; // 一旦找到,停止遍历
        }
        
        inOrder(node.right);
    }
    
    inOrder(root);
    
    return result;
};

讲解
在二叉搜索树(BST)中,中序遍历(左-根-右的顺序)将产生一个有序的序列。因此,要找到第 k 小的元素,我们可以对 BST 进行中序遍历,同时使用一个计数器来跟踪我们已经访问了多少个节点。当计数器的值等于 k 时,我们正在访问的节点就是第 k 小的元素。

  1. 初始化计数器:创建一个变量 count 初始化为 0 ,用于记录已访问的节点数量。
  2. 定义中序遍历函数:定义一个递归函数 inOrder(node) ,它接收一个节点作为参数。在函数中,先递归地遍历左子树,然后访问当前节点(计数器加 1 ,检查是否等于 k ),最后递归地遍历右子树。
  3. 访问当前节点:在访问当前节点时,增加 count 的值。如果 count 等于 k,那么当前节点就是第 k 小的元素,返回该节点的值。
  4. 调用中序遍历函数:在主函数中,调用 inOrder(root) 函数开始遍历。
  5. 返回结果:返回找到的第 k 小的元素的值。

网上思路

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

    while (current !== null || stack.length > 0) {
        // 将所有左子节点压入栈中
        while (current !== null) {
            stack.push(current);
            current = current.left;
        }

        // 弹出栈顶元素
        current = stack.pop();
        count++;

        // 如果计数等于 k,返回当前节点的值
        if (count === k) {
            return current.val;
        }

        // 继续遍历右子树
        current = current.right;
    }

    return null; // 如果没有找到,返回 null
}

讲解
kthSmallest 函数:

  1. 初始化一个空栈 stack 和一个指针 current 指向根节点。
  2. 使用 while 循环进行遍历,条件是当前节点不为空或栈不为空。
  3. 内部的 while 循环将所有左子节点压入栈中。
  4. 弹出栈顶元素,更新计数器 count
  5. 如果 count 等于 k,返回当前节点的值。
  6. 否则,继续遍历当前节点的右子树。

总结

没啥好总结的,因为递归yyds

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值