刷题

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

一、题目描述:

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

示例 1:

img

输入:root = [3,1,4,null,2], k = 1
输出:1
示例 2:

img

输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3

提示:

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

进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/kth-smallest-element-in-a-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

分以下几种情况:

若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

任意节点的左、右子树也分别为二叉查找树;

递归实现,根据二叉搜索树的性质,中序遍历二叉搜索树,即先查找左子树,然后将当前节点放入数组中,然后先查找右子树,不断重复上述过程,直至遍历到叶子节点结束,最终就得到了有序的数组

三、AC 代码:

/**
 * Definition for a binary tree node.
 * public 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;
 *     }
 * }
 */
class Solution {
    public int kthSmallest(TreeNode root, int k) {
        List<Integer> list = new ArrayList<>();
        if (root != null) ret(list, root);
        list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        return list.get(k-1);
    }
    private void ret(List<Integer> list, TreeNode root) {
        list.add(root.val);
        if (root.left != null) ret(list, root.left);
        if (root.right != null) ret(list, root.right);
    }
}

四、总结:

image.png

相关文章
|
6月前
刷题(一)
刷题(一)
34 0
|
C语言
【C刷题】day5
【C刷题】day5
44 0
【C刷题】day5
|
C语言
【C刷题】day1
【C刷题】day1
111 0
蓝桥杯刷题-1
蓝桥杯刷题-1
100 1
|
机器学习/深度学习 人工智能 搜索推荐
|
机器学习/深度学习
蓝桥杯刷题(一)
蓝桥杯刷题
109 0
|
前端开发
牛客刷题Day3
牛客刷题Day3
93 0
|
移动开发 前端开发 JavaScript
牛客刷题Day4
牛客刷题Day4
91 0
|
JavaScript 前端开发
牛客刷题Day3(三)
牛客刷题Day3(三)
91 0
|
XML JSON JavaScript