Leetcode 173. 二叉搜索树迭代器

leetcode 1586 二叉搜索树迭代器 II 与 173. 二叉搜索树迭代器 1586 二叉搜索树迭代器 II 与 173. 二叉搜索树迭代器 异同 173由于只需要记录next的值,所以只需要一个cur作为全局变量! 1586由于需要记录pre的值,所以,需要把每次TreeNode的新对象,压入list,以便需要的时候,能及时获取! 173的cur节点,转变为1586的索引posCur 阅读详情

题目

实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。

调用 next() 将返回二叉搜索树中的下一个最小的数。

在这里插入图片描述
BSTIterator iterator = new BSTIterator(root);
iterator.next(); // 返回 3
iterator.next(); // 返回 7
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 9
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 15
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 20
iterator.hasNext(); // 返回 false

提示:

  • next() 和 hasNext() 操作的时间复杂度是 O(1),并使用 O(h) 内存,其中 h 是树的高度。
  • 你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 中至少存在一个下一个最小的数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search-tree-iterator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

注意题目要求: O(1) 时间, O(h) 内存。

使用栈或提前遍历的方式并不可取,这些方式最坏情况下是 O(n) 的空间复杂度。

所以本题正解是:中序遍历的 Morris 算法。(O(1) 时间,O(1) 内存)

因为前面博客已经解释过了,这里不再赘述。

二叉树的中序遍历解析:Leetcode 94. 二叉树的中序遍历 (请看解法三)

代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class BSTIterator {

    private TreeNode cur;
    
    public BSTIterator(TreeNode root) {
        this.cur = root;
    }
    
    /** @return the next smallest number */
    public int next() {
        int ret = 0;
        while(cur != null) {
            if(cur.left == null) {
                ret = cur.val;
                cur = cur.right;
                break;
            } else {
                TreeNode pre = cur.left;
                while(pre.right != null && pre.right != cur) {
                    pre = pre.right;
                }

                if(pre.right == null) {
                    pre.right = cur;
                    cur = cur.left;
                } else {
                    pre.right = null;
                    ret = cur.val;
                    cur = cur.right;
                    break;
                }
            }
        }
        
        return ret;
    }
    
    /** @return whether we have a next smallest number */
    public boolean hasNext() {
        return cur != null;
    }
}

/**
 * Your BSTIterator object will be instantiated and called as such:
 * BSTIterator obj = new BSTIterator(root);
 * int param_1 = obj.next();
 * boolean param_2 = obj.hasNext();
 */
结果

在这里插入图片描述

【中等】力扣算法题解析LeetCode173:二叉搜索树迭代器 本文介绍了如何实现一个二叉搜索树(BST)的中序遍历迭代器 BSTIterator,支持按序访问节点值。通过使用栈模拟递归过程,将空间复杂度优化至 O(h)(h 为树高),并保证 next() 和 hasNext() 的均摊时间复杂度为 O(1)。初始化时将所有左子节点入栈,每次调用 next() 弹出栈顶节点后,再处理其右子树的左链。hasNext() 只需检查栈是否为空。该方法高效且节省内存,适用于大规模数据。 阅读详情

相关推荐

LeetCode 173 二叉搜索树迭代器

实现一个二叉搜索树迭代器 (),基于二叉搜索树(BST)的中序遍历,按升序遍历其节点值。int next()truefalse中序遍历是顺序。二叉搜索树特性是。因此中序遍历二叉搜索树会得到一个递增的序列。

互联网架构师笔记 1411

JAVA程序设计:二叉搜索树迭代器(LeetCode:173)

实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。 调用 next() 将返回二叉搜索树中的下一个最小的数。 示例: BSTIterator iterator = new BSTIterator(root); iterator.next(); // 返回 3 iterator.next(); // 返回 7 iterator.hasNext(); // 返回...

信仰.的博客 454

E-Prime脑电实验打mark全攻略:从端口查询到串并口实战(附常见问题解决)

本文提供了E-Prime脑电实验打mark的完整实战指南,涵盖端口查询、并口与串口配置的核心步骤及常见问题解决。文章深入解析了mark原理,并详细介绍了通过E-Basic脚本和Serial设备对象发送信号的两种方法,帮助研究者实现E-Prime与脑电设备的高精度时间同步,确保实验数据可靠性。

4k5l6j7h8的博客 354

JAVA程序设计: 删除二叉搜索树中的节点(LeetCode:450)

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点; 如果找到了,删除它。 说明: 要求算法时间复杂度为O(h),h 为树的高度。 示例: root = [5,3,6,2,4,null,7] key = 3 ...

信仰.的博客 395

USB之ch376s数据手册

         最近师兄交给我一个项目,虽说刚学嵌入式起步,但上手一个项目怎说都是最好的快速学习方式。因为刚了解ch376s管理U盘的数据,所以先是看了ch376s的数据手册。那我就把数据手册直接放上来吧。。。。      1、概述 CH376 是文件管理控制芯片,用于单片机系统读写 U 盘或者 SD 卡中的文件。 CH376 支持 USB 设备方式和 USB 主机方式,并且内置了 USB 通...

iBGG的博客 6002

【学习笔记-QGIS】 QGIS从零快速上手

安装文章参考:https://zhuanlan.zhihu.com/p/370633306。

Xcong_Zhu的博客 1万+

Leetcode 669 修剪二叉搜索树 Java&Python

给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 示例 1: 输入: 1 / \ 0 2 L = 1 R = 2 输出: 1 \ 2 示例 2: 输入: ...

sinat_33150417的博客 667

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

LeetCode173. 二叉搜索树迭代器(Java)

题目: 实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。 调用 next() 将返回二叉搜索树中的下一个最小的数。 示例: 代码: 解法一 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre...

inferno_devil的博客 387

CTF逆向实战:如何快速识别RC4、TEA和Base64的魔改变种?

本文针对CTF逆向比赛中常见的加密算法魔改问题,详细讲解了如何快速识别和破解RC4、TEA和Base64的变种。通过分析算法核心特征、常见魔改手法,并结合动态调试与脚本编写等实战技巧,帮助逆向分析人员有效应对算法混淆,提升解题效率。

agile9scrum的博客 782

从原理到接法全面了解三相电

从原理到接法全面了解三相电

viixin的博客 1万+

LeetCode173.二叉搜索树迭代器(Java实现)

链接:https://leetcode-cn.com/problems/binary-search-tree-iterator/ class BSTIterator { LinkedList<TreeNode> stack=new LinkedList<>(); public BSTIterator(TreeNode root) { ...

Teacher_HENG 335

KEIL-MDK代码美化神器:AStyle配置全攻略(附常用参数详解)

本文详细介绍了如何在KEIL-MDK中配置和使用AStyle代码格式化工具,包括基础参数设置、高级格式控制、团队协作方案以及KEIL深度集成技巧。通过合理的AStyle配置,开发者可以显著提升代码风格一致性,优化团队协作效率,特别适合嵌入式开发项目。

weixin_30505225的博客 146

173. 二叉搜索树迭代器【 力扣(LeetCode) 】

指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。next() 和 hasNext() 操作均摊时间复杂度为 O(1) ,并使用 O(h) 内存。其中 h 是树的高度。你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。int next()将指针向右移动,然后返回指针处的数字。

yyh520025的博客 1229

将指定文件夹下每张用LabelImg标注的图片中标注部分抠出来保存到指定文件夹下。

将指定文件夹下每张用LabelImg标注的图片中标注部分抠出来保存到指定文件夹下。

weixin_44119674的博客 440

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LeetCode第173题_二叉搜索树迭代器

实现一个二叉搜索树迭代器roottruefalseint next()注意,指针初始化为一个不存在于 BST 中的数字,所以对next()的首次调用将返回 BST 中的最小元素。你可以假设next()调用总是有效的,也就是说,当调用next()时,BST 的中序遍历中至少存在一个下一个数字。

qq_40263592的博客 1925

WINCC7.3破解文件

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

LeetCode 173: 二叉搜索树迭代器

目录LeetCode 173: 二叉搜索树迭代器题目描述解题 LeetCode 173: 二叉搜索树迭代器 题目描述 实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。 调用 next() 将返回二叉搜索树中的下一个最小的数。 示例: BSTIterator iterator = new BSTIterator(root); iterator.next(); // 返回 3 iterator.next(); // 返回 7 iterator.hasNext(); // 返回

s_Shune 138

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

力扣173题:二叉搜索树迭代器(含模拟面试)

在本篇文章中,我们将详细解读力扣第173题“二叉搜索树迭代器”。通过学习本篇文章,读者将掌握如何设计一个二叉搜索树的迭代器,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解,以便于理解。

10年数据\经营分析经验,现任大厂数据分析负责人 1038

【LeetCode】173.二叉搜索树迭代器

本文实现了一个二叉搜索树迭代器BSTIterator,支持中序遍历的惰性求值。关键点在于: 使用栈模拟递归,仅保存当前路径节点,空间复杂度O(h); next()方法每次弹出栈顶元素,并将右子树的左链压栈,保证每次返回最小值; hasNext()判断栈或当前节点是否为空; 均摊时间复杂度O(1),符合迭代器按需访问的特性,避免了一次性遍历的高内存消耗。该设计充分利用BST的中序有序特性,实现高效渐进式遍历。

TsubakiPDF的博客 785

LeetCode-173-二叉搜索树的迭代器-C语言

/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ typedef struct TreeNode Node; typedef struct { ...

SFFS 386

leetcode:173. 二叉搜索树迭代器

题目来源 173. 二叉搜索树迭代器 题目描述 题目解析 使用数组 初始化一个空数组来存放二叉搜索树中的中序遍历 按中序遍历二叉搜索树,并存入数据中 一旦所有节点都在数组中,我们需要一个索引来实现next()和hasNext()这两个函数 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *

OceanStar的博客 459

leetcode173.二叉搜索树迭代器

直接维护一个数组和一个数组下标,中序遍历把二叉搜索树中的值按照顺序放入到数组中。

weixin_74175349的博客 369

力扣热门算法题 168.Excel表列名称,172.阶乘后的零,173.二叉搜索树迭代器

​力扣热门算法题 168.Excel表列名称,172.阶乘后的零,173.二叉搜索树迭代器,每题做详细思路梳理,配套Python&Java双语代码, 2025.07.07 可通过leetcode所有测试用例。 ​

引用原创内容标明出处即可 1443

LeetCode 173. 二叉搜索树迭代器

LeetCode 173. 二叉搜索树迭代器 文章目录LeetCode 173. 二叉搜索树迭代器题目描述一、解题关键词二、解题报告1.思路分析2.时间复杂度3.代码示例2.知识点总结 题目描述 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且

Datao_csdn的博客 291

Java实现 LeetCode 173 二叉搜索树迭代器

173. 二叉搜索树迭代器 实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。 调用 next() 将返回二...

5446

力扣(LeetCode)173. 二叉搜索树迭代器(2022.06.22)

实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。 boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。 int next()将指针向右移动,然后返回指针处的数字。

ChaoYue_miku的博客 355
上一篇: Leetcode 145. 二叉树的后序遍历
下一篇: Leetcode 199. 二叉树的右视图
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值