[leetcode hot 150]第二百三十题,二叉搜索树中第k小的元素

题目:

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。

 

 二叉搜索树(BST)有一个特性:对于树中的任何节点,其左子树上的所有节点的值都小于该节点的值,而其右子树上的所有节点的值都大于或等于该节点的值。

要找到二叉搜索树中的第 k 小的元素,可以使用中序遍历(即先访问左子树,然后是根节点,最后是右子树)。在中序遍历过程中,会按照从小到大的顺序访问所有节点。

利用这个特性,我们就能轻松找到第k个最小元素

 

public class no_230 {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(1);
        root.right = new TreeNode(4);
        root.right.left = new TreeNode(2);

        // 查找第 2 小的元素
        int k = 2;
        int result = kthSmallest(root, k);
        System.out.println("第 " + k + " 小的元素是: " + result);
    }

    public static int kthSmallest(TreeNode root, int k) {
        return findKthSmallest(root, k, new int[k]);
    }

    private static int findKthSmallest(TreeNode node, int k, int[] counter) {
        if (node == null || counter[0] >= k) {
            return -1;
        }

        int left = findKthSmallest(node.left, k, counter);
        if (left != -1) {
            return left;
        }

        counter[0]++;
        if (counter[0] == k) {
            return node.val;
        }

        return findKthSmallest(node.right, k, counter);

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值