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

介绍

中序遍历:左子树 -> 中 -> 右子树

二叉搜索树:中序遍历可以得到有序的序列

递归法

1.使用函数循环递归处理

2.使用一个数组来保存 k, 保证在个个递归函数中都能看到 看的变化;每访问一个节点,这个数减一,当数组中的数为1时,即访问到了第k小的数

/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
public class Solution {public int KthSmallest(TreeNode root, int k) {// 辅助结构,当 k == 1 时 表示访问到 第 k个最小的元素int[] aux = new int[] { k };return Traverse(root, aux);    }// 递归访问public int Traverse(TreeNode node, int[] aux) {if(node == null){// 用 -1 表示访问到终点return -1;}// 先访问左子树{var val = Traverse(node.left, aux);if(val != -1){return val;}}// 访问该节点{if(aux[0] == 1){// 结果return node.val;}aux[0]--;}// 后访问右子树{var val = Traverse(node.right, aux);if(val != -1){return val;}}// 这里是不会走到的根据题意return -1;}
}

优化:

1.使用 引用传递 k, 确保递归函数都能看到k的变换

2.每次访问右子树时,不用判断直接返回结果

/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
public class Solution {public int KthSmallest(TreeNode root, int k) {// 辅助结构,当 k == 1 时 表示访问到 第 k个最小的元素int aux = k;return Traverse(root, ref aux);    }// 递归访问public int Traverse(TreeNode node, ref int aux) {if(node == null){// 用 -1 表示访问到终点return -1;}// 先访问左子树{var val = Traverse(node.left, ref aux);if(val != -1){return val;}}// 访问该节点{if(aux == 1){// 结果return node.val;}aux--;}// 后访问右子树// {//     var val = Traverse(node.right, ref aux);//     if(val != -1)//     {//         return val;//     }// }// // 这里是不会走到的根据题意// return -1;// 一个优化,这里直接返回,如果没找到这里就返回-1return Traverse(node.right, ref aux);}
}

迭代法

1.使用数据结构Stack,模拟真实的栈处理流程

/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
public class Solution {public int KthSmallest(TreeNode root, int k) {// 借助 Stack 模拟栈Stack<TreeNode> s = new Stack<TreeNode>();// 先让第一个节点进栈,后面流程就处理一致了s.Push(root);// 根据题意一定存在结果// while(s.Count > 0)while(true){// 访问左子树var top = s.Peek();if(top != null){s.Push(top.left);continue;}// 将null节点弹出栈s.Pop();// 访问当前节点,这里不用判断 s的数量,根据代码可知,这里至少存在一个节点var visit = s.Pop();if(k == 1){// 第k最小元素return visit.val;}k--;// 访问右子树s.Push(visit.right);}return -1;}
}

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

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

相关文章

软件测试基础篇——Redis

Redis Redis数据库的配置与连接 解压redis数据库的安装包&#xff08;建议把解压后的安装包放到磁盘的根目录&#xff0c;方便访问操作&#xff09;打开【命令行窗口】&#xff1a;winR在命令行窗口&#xff0c;进入到redis安装目录中 ​ 格式一&#xff1a;cd /d redis目录…

Linux安装Zookeeper

1、Zookeeper简介 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域…

自然语言处理从入门到应用——LangChain:记忆(Memory)-[记忆的类型Ⅲ]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 对话令牌缓冲存储器ConversationTokenBufferMemory ConversationTokenBufferMemory在内存中保留了最近的一些对话交互&#xff0c;并使用标记长度来确定何时刷新交互&#xff0c;而不是交互数量。 from langchain.me…

基于灰狼优化(GWO)、帝国竞争算法(ICA)和粒子群优化(PSO)对梯度下降法训练的神经网络的权值进行了改进(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

环保行业如何开发废品回收微信小程序

废品回收是近年来受到越来越多人关注的环保行动。为了推动废品回收的普及和方便&#xff0c;我们可以利用微信小程序进行制作&#xff0c;方便人们随时随地参与废品回收。 首先&#xff0c;我们需要注册并登录乔拓云账号&#xff0c;并进入后台。乔拓云是一个提供微信小程序制作…

数据结构(一):顺序表详解

在正式介绍顺序表之前&#xff0c;我们有必要先了解一个名词&#xff1a;线性表。 线性表&#xff1a; 线性表是&#xff0c;具有n个相同特性的数据元素的有限序列。常见的线性表&#xff1a;顺序表、链表、栈、队列、数组、字符串... 线性表在逻辑上是线性结构&#xff0c;但…

【云原生】Pod详讲

目录 一、Pod基础概念1.1//在Kubrenetes集群中Pod有如下两种使用方式&#xff1a;1.2pause容器使得Pod中的所有容器可以共享两种资源&#xff1a;网络和存储。1.3kubernetes中的pause容器主要为每个容器提供以下功能&#xff1a;1.4Kubernetes设计这样的Pod概念和特殊组成结构有…

Django中级指南:理解并实现Django的模型和数据库迁移

Django 是一个极其强大的 Python Web 框架&#xff0c;它提供了许多工具和特性&#xff0c;能够帮助我们更快速、更便捷地构建 Web 应用。在本文中&#xff0c;我们将会关注 Django 中的模型&#xff08;Models&#xff09;和数据库迁移&#xff08;Database Migrations&#x…

上传代码到GitCode

Git 全局设置 git config --global user.name "AnyaPapa" git config --global user.email "fangtaihongqq.com" 添加SSH密钥 Mac终端输入命令 cd existing_folder git init git remote add origin gitgitcode.net:Java_1710/test.git git add . git co…

2023国赛数学建模A题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

Mac电脑如何把照片以文件格式导出?

在Mac电脑上&#xff0c;我们经常会拍摄、保存和编辑各种照片。有时候&#xff0c;我们可能需要将这些照片以文件形式导出&#xff0c;以便与他人共享、打印或备份。无论您是要将照片发送给朋友、上传到社交媒体&#xff0c;还是保存到外部存储设备&#xff0c;导出照片为文件是…

我的Python教程:使用Pyecharts画柱状图

Pyecharts是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个基于 JavaScript 的数据可视化库&#xff0c;提供了丰富的图表类型和交互功能。通过 Pyecharts&#xff0c;你可以使用 Python 代码生成各种类型的 Echarts 图表&#xff0c;例如折线图、柱状图、饼图、散点图…

java不支持解压rar5的解决办法--引用本地7zip.exe

由于rar5算法未开源&#xff0c;没有合适的JAVA依赖能够解决解压rar5。在运行中报错&#xff1a; javacom.github.junrar.exception.RarException: badRarArchive 通过引用本地7zip.exe&#xff0c;命令行执行解决&#xff1a; private static void unZipRar5File(String fileP…

探索可视化应用的崭新前景

在当今数据驱动的世界中&#xff0c;可视化应用成为了一种强大的工具&#xff0c;能够将复杂的数据转化为易于理解和分析的图形形式。随着技术的不断发展和创新&#xff0c;可视化应用正迎来崭新的前景。本文将介绍可视化应用的定义、重要性以及当前的发展趋势&#xff0c;并探…

Controller是单例还是多例?

Controller是单例还是多例&#xff1f; controller默认是单例的&#xff0c;不要使用非静态的成员变量&#xff0c;否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。 我们下面来简单的验证下&#xff1a; package com.riemann.springbootdemo.controller;import org…

docker配置文件

/etc/docker/daemon.json 文件作用 /etc/docker/daemon.json 文件是 Docker 配置文件&#xff0c;用于配置 Docker 守护进程的行为和参数。Docker 守护进程是负责管理和运行 Docker 容器的后台进程&#xff0c;通过修改 daemon.json 文件&#xff0c;可以对 Docker 守护进程进…

不做Linux就没前途吗?

答案当然是——并不会 我晚上回来的时候跟一个今年的毕业生聊天&#xff0c;他入职了一家公司&#xff0c;但是从事的不是Linux相关的工作。 我这里想说的是&#xff0c;做Linux可以赚钱&#xff0c;Linux现在是全世界最牛逼的开源项目一点都不为过&#xff0c;但是Linux也不是…

NLP(六十五)LangChain中的重连(retry)机制

关于LangChain入门&#xff0c;读者可参考文章NLP&#xff08;五十六&#xff09;LangChain入门 。   本文将会介绍LangChain中的重连机制&#xff0c;并尝试给出定制化重连方案。   本文以LangChain中的对话功能&#xff08;ChatOpenAI&#xff09;为例。 LangChain中的重…

【Mysql】数据库基础与基本操作

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…