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

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 中序遍历
    • 2. 预处理

在这里插入图片描述

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);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:特效绘制合并)

用于对背景模糊等特效进行绘制合并。 说明&#xff1a; 从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该接口为系统接口。 useEffect useEffect(value: boolean) 用于对背景模糊等特效进行绘制合并。 系统能力&#…

分布式数字身份:通往Web3.0世界的个人钥匙

数字化时代&#xff0c;个人身份已不再仅仅局限于传统形式&#xff0c;分布式数字身份&#xff08;Decentralized Identity&#xff0c;简称DID&#xff09;正崭露头角&#xff0c;它允许个人通过数字签名等加密技术&#xff0c;完全掌握和控制自己的身份信息。研究报告显示&am…

HarmonyOS NEXT应用开发——Navigation开发 页面切换场景范例

简介 在应用开发时&#xff0c;我们常常遇到&#xff0c;需要在应用内多页面跳转场景时中使用Navigation导航组件做统一的页面跳转管理&#xff0c;它提供了一系列属性方法来设置页面的标题栏、工具栏以及菜单栏的各种展示样式。除此之外还拥有动态加载&#xff0c;navPathSta…

Linux 桌面版系统问题分析及CDH 6影响分析,CDH做HA模式配置教程

一、问题 由于之前是第一次安装CentOS系统&#xff0c;基本上是按照网上的教程安装&#xff0c;安装了桌面版&#xff0c;配置默认&#xff0c;在安装CDH6.3后&#xff0c;在使用中发现没有预期的那么好用&#xff0c;然后请教专业人士后&#xff0c;得出以下2个原因 1、桌面…

将圆环区域展开成矩形长条

在机器视觉领域&#xff0c;经常会遇到圆环型的检测目标&#xff0c;比如瓶口&#xff0c;轮胎&#xff0c;橡皮圈等等&#xff0c;比如想检测轮胎上的瑕疵&#xff0c;就可以通过把环形区域展开成矩形形状&#xff0c;然后对胎侧进行瑕疵检测&#xff0c;再比如对圆环扣上的字…

2024大厂Android面试集合,安卓开发面试书籍

前言 早在2017年我们就建了第一个进击BAT的Android开发进阶交流群&#xff0c;两年期间很多群友都分享了自己的Android面试经历。其中就有很多群友已经斩获蚂蚁金服&#xff0c;天猫&#xff0c;高德&#xff0c;盒马等阿里系offer 收集反馈的面经资料比较乱&#xff0c;最近…

2024BAT大厂Java社招最全面试题,成功入职字节跳动

前言 现在Java程序员面试都是因为没有丰富的工作经验和自己过硬的技术&#xff0c;所有都不知道一般互联网应该会问什么技术问题&#xff0c;加上自己可能去面试的时候没有准备的太充分&#xff0c;一面试刚跟面试官扯几个面试题就不知道自己在哪里了&#xff0c;被怼的体无完…

● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

● 198.打家劫舍 动规五部曲。 1、dp[j]含义。前j个房屋偷到的金额之和最大是dp[j]。 2、递推公式。递推公式要得出dp[i]&#xff0c;就是要确定第i个房屋是否打劫&#xff0c;那么也跟之前的背包问题一样&#xff0c;放与不放&#xff0c;对应的是两种结果&#xff0c;我们只需…

旺泓_光感WH3620_数字RGBW-IR色彩传感器

由工采网代理的WH3620是一种基于颜色的光到数字转换器;它集光电二极管、电流放大器、模拟电路和数字信号处理器于一体&#xff1b;提供红、绿、蓝、白和红外光传感&#xff1b;能调节屏幕或灯光白平衡&#xff1b;各通道同时并行输出&#xff0c;因此在白光LED、CWF、TL84、D65…

防患未然,OceanBase巡检工具应用实践——《OceanBase诊断系列》之五

1. OceanBase为什么要做巡检功能 尽管OceanBase拥有很好的MySQL兼容性&#xff0c;但在长期的生产环境中&#xff0c;部署不符合标准规范、硬件支持异常&#xff0c;或配置项错误等问题&#xff0c;这些短期不会出现的问题&#xff0c;仍会对数据库集群构成潜在的巨大风险。为…

脾胃论笔记

焦虑会导致脾胃受伤 焦虑等不良情绪也会导致脾胃受伤&#xff0c;我们称其为肝气不舒。肝气不舒会导致脾胃系统出问题&#xff0c;这叫肝木横逆克脾土&#xff0c;木克土&#xff0c;脾胃就容易受伤。 这样的情况在现代社会特别多。这跟古人就不一样&#xff0c;古人生活相对…

Python爬虫——Requests

目录 简介 基本使用​编辑 ​编辑 安装 一个类型和六个属性 请求类型 GET 代码示例 POST 代码示例 代理 古诗文网绕过验证码登录 总结 简介 Python的Requests库是一个用于发送HTTP请求的常用库。它提供了简单且人性化的API&#xff0c;使得发送HTTP请求变得非常容易。…

完美解决VMware中配置suse10虚拟机网络

一、注意&#xff01;&#xff01;&#xff01;配置suse10网络&#xff0c;需要在虚拟机关机状态下进行&#xff0c;否则会配置不成功&#xff1b; 二、配置与主机在同一网段(仅主机模式&#xff0c;网卡一)&#xff1b; 在suse系统关机状态下&#xff0c;Vmware中设置”虚拟网…

2024华为Android高级面试题及答案,android系统工程师面试

大厂offer是每个技术人的追求? 我觉得每一个程序员的梦想大概就是能够找一份大厂的 Offer&#xff0c;我觉得这很正常&#xff0c;这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/…

0.8秒一张图40hx矿卡stable diffusion webui 高质极速出图组合(24.3.3)

新消息是。经过三个月的等待&#xff0c;SD Webui (automatic1111)终于推出了新版本1.8.0&#xff0c;本次版本最大的更新&#xff0c;可能就是pytorch更新到2.1.2, 不过还是晚了pytorch 2.2.2版。 不过这版的一些更新&#xff0c;在forget分支上早就实现了&#xff0c;所以。…

2核4G云服务器就服阿里云,这性能无敌了

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

一文了解74HCT14D的引脚图、符号、封装、数据手册及应用

74HCT14D 是一款采用硅栅 C2MOS 技术制造的高速 CMOS 施密特逆变器。它实现了类似于等效 LSTTL 的高速操作&#xff0c;同时保持 CMOS 的低功耗。该器件可用作电平转换器&#xff0c;用于将 TTL 或 NMOS 连接到高速 CMOS。 输入与 TTL、NMOS 和 CMOS 输出电压电平兼容。所有输入…

什么是工业级物联网智能网关?如何远程控制PLC?

在这个信息爆炸的时代&#xff0c;物联网技术已经逐渐渗透到我们生活的方方面面&#xff0c;而工业级物联网智能网关作为连接工业设备和云端的重要桥梁&#xff0c;更是引领着工业4.0时代的浪潮。那么&#xff0c;究竟什么是工业级物联网智能网关呢&#xff1f;今天&#xff0c…

Python网络请求高级篇:Requests库的深度运用

在Python网络请求中级篇中&#xff0c;我们了解了如何通过Requests库发送带参数的请求&#xff0c;处理Cookies&#xff0c;使用Session对象&#xff0c;以及设置请求头。在本文中&#xff0c;我们将进一步深入学习Requests库的高级功能&#xff0c;包括处理重定向&#xff0c;…

Codesys 位置式PID闭环控制系统(PID+PWM控制无刷电机)

有关Codesys位置式PID算法公式和源代码,请参考下面文章链接: 1、Codesys位置式PID https://rxxw-control.blog.csdn.net/article/details/131591254https://rxxw-control.blog.csdn.net/article/details/1315912542、博途PLC PWM输出控制 https://rxxw-control.blog.csdn.…