刷题

简介: ## 一、题目描述:给定一个二叉搜索树的根节点 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

相关文章
|
4天前
leetcode59刷题打卡
leetcode59刷题打卡
14 0
|
4天前
leetcode541刷题打卡
leetcode541刷题打卡
16 0
|
4天前
刷题之Leetcode283题(超级详细)
刷题之Leetcode283题(超级详细)
8 0
|
4天前
|
索引
刷题之Leetcode209题(超级详细)
刷题之Leetcode209题(超级详细)
12 0
|
4天前
|
算法
刷题之Leetcode34题(超级详细)
刷题之Leetcode34题(超级详细)
12 0
|
4天前
|
算法
刷题之Leetcode704题(超级详细)
刷题之Leetcode704题(超级详细)
12 0
|
4天前
|
索引
leetcode18刷题打卡
leetcode18刷题打卡
19 0
|
4天前
leetcode1047刷题打卡
leetcode1047刷题打卡
15 0
|
12月前
|
测试技术 索引
leetcode刷题(2)
各位朋友们,又是新的一天,不知道大家过得怎样?今天是我leedcode刷题系列的第二篇,那么废话不多说,直接进入我们今天的主题。
|
12月前
|
Java 测试技术 C语言
leetcode刷题(5)
各位朋友们,大家好,今天是我leedcode刷题的第五篇,我们一起来看看吧。