java数据结构与算法刷题-----LeetCode230. 二叉搜索树中第K小的元素

超详细!新手必看STM32-DMA配置与实验(串口使用DMA发送数据) DMA就是:直接存储器访问。DMA传输数据从一个地址空间复制到另一个地址空间,提供在外设和存储器或者存储器和存储器之间的高速数据传输。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

1. 中序遍历

解题思路:时间复杂度O(H+k)其中H是树高,k是要找第几个结点。空间复杂度O(H)
  1. 二叉搜索树,中序遍历序列就是升序排列。比如上面示例1的中序遍历结果为1,2,3,4,正好是升序序列
  2. 所以我们只需要进行中序遍历的过程中记录当前是第几个结点,如果是第k个,直接返回即可。
代码
  1. 递归法
    在这里插入图片描述
class Solution {
    int ans;//保存答案
    int th=0;//保存当前遍历到第几个结点
    public int kthSmallest(TreeNode root, int k) {
        ans = root.val;//初始答案默认为根结点
        dfs(root,k);
        return ans;
    }
    public void dfs(TreeNode root , int k){
        if(root == null) return;
        if(th>=k)return;//如果已经找到第k个,就不用继续遍历了
        dfs(root.left,k);//否则先遍历左子树
        if(++th == k) ans = root.val;//然后判断是否到第k个,到了就记录当前结点值
        dfs(root.right,k);//否则继续遍历右子树
    }
}
  1. 迭代法
    在这里插入图片描述
class Solution {
    public int kthSmallest(TreeNode root, int k) {
        Deque<TreeNode> stack = new ArrayDeque<TreeNode>();//迭代法深度优先
        //中序遍历迭代法,
        while (root != null || !stack.isEmpty()) {
            while (root != null) {//先遍历左子树
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();//遍历中间结点
            if (--k == 0) break;//同时进行k--,当k为0时,表示找到了
            root = root.right;//然后遍历右子树
        }
        return root.val;
    }
}

2. 预处理

如果需要频繁进行查找第k个元素的操作,就不能每次都进行中序遍历,太费时间了,平均时间复杂度会很高

所以我们记录每个结点的左子结点个数,和右子结点个数

  1. 当前node.left的结点个数<k-1,则第k小元素在node.right. 此时去右边只需找第k - left - 1个元素即可
  2. node.left结点个数 = k-1,则第k小元素为node,返回node即可
  3. node.left结点个数 > k-1,则第k小元素在node.left,令node = node.left继续搜索即可
代码:此算法做题肯定慢,但是实战中,仅仅是第一次预处理时会慢,之后再查的时候就会很快了

在这里插入图片描述

class Solution {
    public int kthSmallest(TreeNode root, int k) {
        MyBst bst = new MyBst(root);
        return bst.kthSmallest(k);
    }
}

class MyBst {
    TreeNode root;
    Map<TreeNode, Integer> nodeNum;

    public MyBst(TreeNode root) {
        this.root = root;
        this.nodeNum = new HashMap<TreeNode, Integer>();
        countNodeNum(root);
    }

    // 返回二叉搜索树中第k小的元素
    public int kthSmallest(int k) {
        TreeNode node = root;
        while (node != null) {
            int left = getNodeNum(node.left);
            if (left < k - 1) {
                node = node.right;
                k -= left + 1;
            } else if (left == k - 1) {
                break;
            } else {
                node = node.left;
            }
        }
        return node.val;
    }

    // 统计以node为根结点的子树的结点数
    private int countNodeNum(TreeNode node) {
        if (node == null) {
            return 0;
        }
        nodeNum.put(node, 1 + countNodeNum(node.left) + countNodeNum(node.right));
        return nodeNum.get(node);
    }

    // 获取以node为根结点的子树的结点数
    private int getNodeNum(TreeNode node) {
        return nodeNum.getOrDefault(node, 0);
    }
}
内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box 内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box。 阅读详情

相关推荐

【Unity】Unity性能分析解决方案——UPR

由Unity中国团队提供的一套性能优化解决方案,其是一系列性能工具的集合,并可将收集的数据进行可视化。

Davidorzs的博客 1008

LeetCode Java刷题笔记— 230. 二叉搜索树中第K小的元素

LeetCode Java刷题笔记— 230. 二叉搜索树中第K小的元素

终生学习践行者 426

BIM Revit教程(六)尝试安装 Revit 时显示“Autodesk Revit 已安装。”

在安装Revit或RevitLT时,若系统提示“AutodeskRevit版本已安装”,通常是由于旧版本残留文件未完全清除所致。解决方案包括:1.通过控制面板或Windows设置卸载旧版本Revit,确保所有相关组件被移除;2.使用Autodesk卸载工具(AdskUninstallHelper)进一步清理;3.谨慎操作注册表,删除与Revit相关的残留项;4.确保系统有至少30GB的可用磁盘空间;5.完成上述步骤后,重新尝试安装Revit。此外,文章还提到了一个免费功能商店,供用户寻找提效工具,并鼓励粉丝

ZOZO_888的博客 2131

leetcode第230题, 二叉搜索树中第K小的元素,java实现

一、迭代法 运行结果 执行结果:通过 执行用时 :1 ms, 在所有 Java 提交中击败了83.31%的用户 内存消耗 :37.9 MB, 在所有 Java 提交中击败了25.55%的用户 代码与注释 // 求解思路:题目已知条件是二叉搜索树,中序遍历得到的结果就是升序的。 class Solution { public int kthSmallest(TreeNode root, i...

qq_29168809的博客 527

开关电源设计实战:如何用AP值快速选型磁芯(附计算公式推导)

本文为开关电源工程师提供了基于AP值的磁芯快速选型实战指南。文章深入解析了AP值作为磁芯‘功率吞吐量’指标的核心物理意义,并通过详细的公式推导和24W反激电源设计实例,手把手演示如何利用AP值计算公式,结合电流密度、窗口利用率等关键参数,从众多磁芯型号中高效筛选出合适型号,同时强调了选型后的关键校验步骤与常见误区。

weixin_29234239的博客 876

软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)

软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)一、Charles简介二、Charles下载与安装三、Charles配置(1)Charles-PC端的配置如下:(2)过滤网络请求:(3)Charles抓取HTTPS请求包前置条件:(4)Charles抓取HTTPS双向认证包:关注我,免费领取学习资料 嘿。大家好,我是4U: 做过 APP 测试的同学都会接触抓包工具,通过抓包工具可以获取到客户端与服务端接口的交互数据,在实际测试APP的过程中,我们往往会发现服务端返回 的参数字段错

leboxy的博客 4154

LeetCode-230. Kth Smallest Element in a BST (JAVA)二叉树第k小的数字

LeetCode-230. Kth Smallest Element in a BST (JAVA)二叉树第k小的数字

mine_song的博客 1365

【机械臂算法】机械臂动力学参数辨识仿真

本文以puma560m机械臂为例子进行动力学参数辨识的讲解,puma560m可以在robotic toolbox中找到,这里以它真实机械臂对他的动力学参数进行辨识。此外这里还有要说的是,机械臂参数辨识其实是一个系统工程,其中和系统的机械、电子、嵌入式都有着很深的联系,并不是仿真这么简单的。

vrijheid的博客 7836

leetcode oj java 230. Kth Smallest Element in a BST

一、问题描述: Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Note:  You may assume k is always valid, 1 ≤ k ≤ BST's total elements. 二、解决思路:

Xcy的博客 391

Oracle EBS FA 如何打开关闭的资产会计期间?

用户“运行折旧”,误勾选为“关闭期间”,还有一部分资产还需要操作报废和调整,希望后台打开关闭的资产会计期。

陈显平的专栏-Oracle EBS 1032

AI使能的SVD算子:基于深度学习的矩阵分解方法

奇异值分解(Singular Value Decomposition, SVD)是线性代数中一种重要的矩阵分解方法,广泛应用于信号处理、数据降维、推荐系统等领域。传统SVD算法虽然精确,但在处理大规模矩阵时面临计算复杂度高、内存需求大等问题。本文提出了一种基于深度学习神经网络的SVD算子实现方法,完全摒弃传统数值算法,仅使用PyTorch框架构建的神经网络模型来完成大规模信道矩阵的SVD分解与还原。

huanghm88的专栏 1338

leetcode-java-230. Kth Smallest Element in a BST

/* Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Note: You may assume k is always valid, 1 ≤ k ≤ BST's total elements.Follow up: What if the BST is

王欢的博客 438

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java实现 LeetCode 230 二叉搜索树中第K小的元素

230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 输出: 1 示例 2: 输入: root = [5,3,6,2,...

南 墙 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCode Java面试刷题笔记汇总

LeetCode Java刷题笔记汇总,按照类型刷题效率更高。

终生学习践行者 2948

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

力扣最热一百题——二叉搜索树中第 K 小的元素

二叉搜索树的常规操作,寻找第n小的元素!!!新手也应该会的题目!!!

WenJGo的博客 896

【忍者算法】从图书馆找书到二叉搜索树:如何快速找到第K小的元素|LeetCode 230 二叉搜索树中第K小的元素

中序遍历有序性:BST问题的解题基石

忍者算法的博客 1145

【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣99, 1305, 230, 897

时间复杂度为O(n*logn),是由于调库的排序方法的时间复杂度是O(n*logn)。空间复杂度是O(n),因为使用了跟树节点大小的列表空间。将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。中序遍历得到node节点,然后插入到递增的顺序链表中。2 不能在 3 的右子树中,因为 2 < 3。3 不能是 1 的左孩子,因为 3 > 1。把两个树中所有的节点的值都放进了一个列表,排序以后返回。给定一个二叉搜索树的根节点。给你二叉搜索树的根节点。

2301_80912559的博客 1519

Leetcode刷题100天—230. 二叉搜索树中第K小的元素—day69

前言:这解法有点拉胯仅供参考 作者:神的孩子在歌唱 一个努力学算法的小菜鸡 大家好,我叫智 230. 二叉搜索树中第K小的元素 难度中等541 给定一个二叉搜索树的根节点 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 &l

智的博客 1834

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

Leetcode230. 二叉搜索树中第K小的元素 题目: 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 输出: 1 示例 2: 输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \

会流泪de鱼的博客 189

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

参考链接:https://blog.csdn.net/yuanliang861/article/details/84640069 题目: 解法一:中序遍历 很好理解,网上答案很多,不废话。 解法二:二分查找 题目分析: 二叉搜索树特点:左孩子值小于根节点,根节点值小于右孩子,那么树中最小节点一定是根节点最左边孩子。 思路: 如果根节点的左子树数量为k-1,那么第k小的为根节点。 如果根...

LaZY的博客 609

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

我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/description/ 题目描述: 知识点:二叉搜索树、递归 思路:递归地寻找二叉搜索树中第K小的元素 时间复杂度是O(kN),其中N为二叉搜索...

清风阁 585

[LeetCode]230. 二叉搜索树中第K小的元素(java实现)

[LeetCode]230. 二叉搜索树中第K小的元素(java实现)1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 结合二叉搜索树的特性,二叉搜索树经过中序遍历,就能生成一个排好序的数组,因此,直接查找第k个值返回即可。 3. 解法 解法:递归遍历 class Solution { List<Integer> list = new ArrayList<>

cloud的博客 504

【LeetCode热题100】Java详解:二叉搜索树中第K小的元素(含进阶优化与面试延伸)

场景推荐方案只查一次方法一(简单高效)静态树,多次查询方法二(预处理 + O(H) 查询)动态树,高频操作方法三(AVL/红黑树 + 维护 size)内存极度受限方法一(空间 O(H) 最小)需要支持重复值自定义比较器 + 允许重复的 BST💡 工程实践中,可结合缓存(如 LRU Cache)进一步优化热点查询。BST 的中序遍历 = 升序序列是解题钥匙提前终止是优化遍历类问题的关键技巧子树大小(size)是实现 Order Statistic 的基础平衡树是动态场景的终极武器。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 1151
上一篇: java数据结构与算法刷题-----LeetCode637. 二叉树的层平均值
下一篇: java数据结构YZP专栏-----二叉树 && 平衡二叉树(AVL)
ydenergy_殷志鹏
博客等级 码龄7年 5886粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值