我是靠谱客的博主 淡定小海豚,最近开发中收集的这篇文章主要介绍[Leetcode每日一题]230. 二叉搜索树中第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

提示:
树中的节点数为 n 。
1 <= k <= n <= 104
0 <= Node.val <= 104

代码:

package leetcodeday1;

public class leetcode230 {
    /**
     * 由于二叉搜索树,左子树一定小于该节点,右子树一定大于该节点,所以我们可以
     * 1。先确定第k小元素的位置,我们可以先得到根节点左子树的数量leftNum
     *      (1)如果k < leftNum,则该元素在根节点的左子树中
     *      (2)如果k = leftNum + 1, 则该元素是根节点
     *      (3)如果k > leftNum + 1, 则该元素在根节点的右子树中
     * 2。确定位置后,我们可以进行递归回溯,即确定后将该节点的左孩子或者右孩子重新作为根节点进行判断
     * 3。结束条件为 情况(2)
     * 
     * 但这样时间复杂度会高很多,因为每次往下都会去统计左子树的元素数量
     */
    public int kthSmallest(TreeNode root, int k) {
        int leftNum = getLeftNum(root.left);
        // 结束条件
        if (leftNum + 1 == k){
            return root.val;
        }
        else if (k <= leftNum){
            return kthSmallest(root.left, k);
        }
        else {
            return kthSmallest(root.right, k - leftNum - 1);
        }
    }

    // 获得左子树中元素的数量
    private int getLeftNum(TreeNode root) {
        // 结束条件
        if (root == null){
            return 0;
        }
        return getLeftNum(root.left) + getLeftNum(root.right) + 1;
    }

}

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode() {
    }

    TreeNode(int val) {
        this.val = val;
    }

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

最后

以上就是淡定小海豚为你收集整理的[Leetcode每日一题]230. 二叉搜索树中第K小的元素的全部内容,希望文章能够帮你解决[Leetcode每日一题]230. 二叉搜索树中第K小的元素所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(29)

评论列表共有 0 条评论

立即
投稿
返回
顶部