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) 用于对背景模糊等特效进行绘制合并。 系统能力&#…

华为荣耀终端机试真题

文章目录 一 、字符展开(200分)1.1 题目描述1.2 解题思路1.3 解题代码二、共轭转置处理(100分)2.1 题目描述2.3 源码内容一 、字符展开(200分) 1.1 题目描述 // 64 位输出请用 printf(“%lld”)给定一个字符串,字符串包含数字、大小写字母以及括号(包括大括号、中括号…

分布式数字身份:通往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、桌面…

在Linux中使用docker【下】(常见命令下)

在Linux中使用docker【下】&#xff08;常见命令下&#xff09; 一、Docker介绍二、在Linux中使用Docker的意义2.1 轻量级与资源高效2.2 快速部署与版本控制2.3 隔离与安全2.4 简化运维2.5 跨平台兼容2.6 持续集成与持续部署&#xff08;CI/CD&#xff09; 三、Docker的安装3.1…

JVM 启动参数

jvm的启动参数随版本发展可以分为三大类&#xff1a;标准参数、非标准参数和非Stable参数。 1. 标准参数&#xff1a;所有JVM实现都必须支持这些参数&#xff0c;且向下兼容。 如&#xff1a;-jar -cp -verbose 2. 非标准参数&#xff1a;大多数JVM实现都支持这些参数&#…

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

在机器视觉领域&#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;仍会对数据库集群构成潜在的巨大风险。为…

一个简单的HTML 个人网页

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>个人网页</title> <style> body { f…

脾胃论笔记

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

C语言哈希表用法

文章目录 前言一、哈希结构体&#xff1f;二、增删差3、遍历&#xff0c;清空&#xff0c;计数 前言 哈希表在头文件“utash.h”中已经有了&#xff0c;只需简单学习用法即可 例如&#xff1a;随着人工智能的不断发展&#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;所以。…