当前位置: 首页 > news >正文

Leetcode 二叉搜索树迭代器

在这里插入图片描述

通俗地解释这道题目的要求

这道题目要求你设计一个二叉搜索树(BST)的迭代器,让你能够像遍历一个数组那样,依次获取 BST 中的元素,并且始终按照 从小到大(中序遍历:左 -> 根 -> 右) 的顺序返回数据。

你需要实现:

  1. BSTIterator(TreeNode root):构造函数,接收 BST 的根节点,并初始化迭代器。
  2. int next():返回 BST 中下一个最小的元素(即按中序遍历顺序)。
  3. boolean hasNext():判断 BST 是否还有下一个元素可用。

简单理解:这个迭代器就像一本书的书签

  • BSTIterator 代表你正在阅读这本“BST 书”。
  • next() 就像翻页,每次都会给你下一个最小的值
  • hasNext() 让你知道书里是否还有内容可以读。

举个例子

假设给你这样一棵 BST:

       7
      / \
     3   15
        /  \
       9    20

如果我们直接做中序遍历(左 -> 根 -> 右),顺序应该是:

3 → 7 → 9 → 15 → 20

你的 BSTIterator 需要实现:

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

换句话说,你需要实现一个数据结构,它能像“顺序访问数组”那样,从 BST 里按顺序取出数值。


和一般的 BST 遍历有啥区别?

通常,我们用递归(dfs(root.left); print(root.val); dfs(root.right);)来做中序遍历。但这样一次性就遍历完整棵树,不适用于只想一步步获取值的情况

这个迭代器的核心目标
不用一次性遍历完整棵树,而是按需取值
next() 只返回当前的最小值,不会提前访问其他值
hasNext() 只是检查还有没有值,而不会真正访问数据

这样,你可以像读小说一样一页一页地访问 BST,而不是一次性读完所有内容!

java solution

class BSTIterator {
    private Stack<TreeNode> stack;
    public BSTIterator(TreeNode root) {
        stack = new Stack<>();
        pushLeftNodes(root);
    }
    
    public int next() {
        TreeNode node = stack.pop();
        //之所以判断右子树,是因为当前节点相当于根节点,其值马上要被返回,下一个最小值是当前节点的右子树根节点
        if(node.right != null) {
            pushLeftNodes(node.right);
        }
        return node.val;
    }
    
    public boolean hasNext() {
        return (!stack.isEmpty());
    }

    private void pushLeftNodes(TreeNode node) {
        while(node != null) {
            stack.push(node);
            node = node.left;
        }
    }
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/51062.html

相关文章:

  • MWC 2025|紫光展锐联手美格智能发布5G通信模组SRM812
  • 【TCP/IP协议栈】4. 传输层协议(TCP、UDP)
  • 2.4GHZ无线跳频算法 C语言
  • Mayavi一个强大的python库
  • 主动推送数据到前端的SSE技术原理以及如何使用
  • Python从0到100(八十八):LSTM网络详细介绍及实战指南
  • vue3(笔记)4.0 vueRouter.导航守卫.ElementPuls知识点
  • node项目前后端密码加密传输及存储方案
  • SpringBoot调用DeepSeek
  • MySQL表连接详解
  • 爬虫(持续更新ing)
  • Thonny+MicroPython+ESP32开发环境搭建
  • 【leetcode hot 100 189】轮转数组
  • ChatVLA:基于视觉-语言-动作模型的统一多模态理解与机器人控制
  • (2025)Unity调用DeepSeek API (兼容OpenAI SDK)
  • 在Windows实现将Docker Desktop安装至非系统盘(2025年3月测试有效)
  • Kmeans算法来实现RFM指标计算步骤
  • 算法 并查集
  • Axure原型模板与元件库APP交互设计素材(附资料)
  • Bitmap -> Bitmap安卓设备上的显示和内存
  • 汽车轮胎损伤缺陷分割数据集labelme格式1957张3类别
  • iOS安全和逆向系列教程 第1篇: iOS逆向工程概述与学习路线图
  • 第七章:项目实战 - 第四节 - Tailwind CSS 移动端适配实践
  • 计算机毕业设计SpringBoot+Vue.js装饰工程管理系统(源码+文档+PPT+讲解)
  • 算数操作符、赋值操作符、单目操作符、强制类型转换
  • 五、Redis 持久化:RDB 与 AOF 深入解析与优化策略
  • linux一些使用技巧
  • Rust 入门+语法详解+Windows 下 Cursor AI辅助开发
  • Linux中死锁问题的探讨
  • 【C语言】结构体自动对齐问题 解析与解决方案