LeetCode_数据结构设计_中等_173.二叉搜索树迭代器

news2024/11/30 8:37:53

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:

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

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

示例:

在这里插入图片描述

输入
["BSTIterator", "next", "next", "hasNext", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
[[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
输出
[null, 3, 7, true, 9, true, 15, true, 20, false]
解释
BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
bSTIterator.next();    // 返回 3
bSTIterator.next();    // 返回 7
bSTIterator.hasNext(); // 返回 True
bSTIterator.next();    // 返回 9
bSTIterator.hasNext(); // 返回 True
bSTIterator.next();    // 返回 15
bSTIterator.hasNext(); // 返回 True
bSTIterator.next();    // 返回 20
bSTIterator.hasNext(); // 返回 False

提示:
树中节点的数目在范围 [1, 105] 内
0 <= Node.val <= 106
最多调用 105 次 hasNext 和 next 操作

进阶:
你可以设计一个满足下述条件的解决方案吗?next() 和 hasNext() 操作均摊时间复杂度为 O(1) ,并使用 O(h) 内存。其中 h 是树的高度。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-search-tree-iterator

2.思路

(1)扁平化

(2)迭代

3.代码实现(Java)

//思路1————扁平化
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class BSTIterator {

    private int idx;
    private List<Integer> nums;

    public BSTIterator(TreeNode root) {
        idx = 0;
        nums = new ArrayList<>();
        inorderTraversal(root, nums);
    }
    
    public int next() {
        return nums.get(idx++);
    }
    
    public boolean hasNext() {  
        return idx < nums.size();
    }

    //前序遍历,并将遍历到的节点值依次存储到 nums 中
    private void inorderTraversal(TreeNode root, List<Integer> nums) {
        if (root == null) {
            return;
        }
        inorderTraversal(root.left, nums);
        nums.add(root.val);
        inorderTraversal(root.right, nums);
    }
}

/**
 * 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();
 */
//思路2————迭代
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class BSTIterator {
    private TreeNode cur;
    private Deque<TreeNode> stack;

    public BSTIterator(TreeNode root) {
        cur = root;
        stack = new LinkedList<TreeNode>();
    }
    
    public int next() {
        while (cur != null) {
            stack.push(cur);
            cur = cur.left;
        }
        cur = stack.pop();
        int ret = cur.val;
        cur = cur.right;
        return ret;
    }
    
    public boolean hasNext() {
        return cur != null || !stack.isEmpty();
    }
}

/**
 * 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();
 */

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

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

相关文章

便捷工具箱(更新中)

遇到问题怎么办&#xff1f;不慌&#xff0c;我可以帮你解决 1.浏览器视频播放速度一般只有0.5x&#xff0c;1.0x&#xff0c;1.5x&#xff0c;2.0x四种选项&#xff0c;对于我们来说是不够用的&#xff0c;那该怎么办呢&#xff1f;别慌&#xff0c;有代码。 解决办法&#x…

Python3+Selenium2完整的自动化测试实现之旅(一):自动化测试环境搭建

引言 大多数人可能认为自动化测试很难&#xff0c;但是在我的实践中&#xff0c;我发现只要有正确的工具和环境&#xff0c;自动化测试其实并不困难。 本文将带领大家了解如何使用Python3和Selenium2搭建自动化测试环境&#xff0c;让你在未来的测试工作中事半功倍。作为一名…

安卓逆向 -- SO文件逆向分析

接上节课内容 安卓逆向 -- Frida环境搭建(HOOK实例) 安卓逆向 -- FridaHook某车udid的加密值 安卓逆向 -- FridaHook分析3DES加密值 一、上节课我们找到了get3deskey函数来自原生函数 二、解压apk文件&#xff0c;去lib文件里找到libnative-lib.so文件 三、将so文件拖入ida…

企业通常会采用什么方式与媒体建立关系?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网 胡老师。 媒体机构包括电视台、广播电台、报纸、杂志、网络媒体&#xff0c;视频媒体等。企业与媒体建立联系&#xff0c;可以提升品牌曝光度、塑造公众形象、传递企业信息、增加市场认知和促进业…

阿里云丁宇:云上开发成为主流,Serverless 定义新范式

今天&#xff0c;阿里云峰会粤港澳大湾区在广州开幕&#xff0c;阿里巴巴研究员、阿里云智能云原生应用平台总经理丁宇在论坛发言&#xff0c;他表示&#xff1a; Serverless 引领云上开发新范式&#xff0c;通过丰富的原子化服务&#xff0c;全托管、高弹性、免运维的优势&am…

【libdatachannel】俩client本机基于juice与QtSignalServer的ICE交互2

打印日志太多&#xff0c;【libdatachannel】俩client本机基于juice与QtSignalServer的ICE交互 1 死活发不出来。 客户端一系列的状态切换。 kY3k alloc: (location: 04259598) freed alloc: (location: 042629E0) allocated alloc: (location: 04262A50) allocated alloc: …

这才是打开Java面试的正确方式,秋招互联网大厂Java面试八股来袭

金三银四过后招聘旺季就到了&#xff0c;不知道大家是否准备好了&#xff0c;面对金九银十的招聘旺季&#xff0c;如果没有精心准备那笔者认为那是对自己不负责任&#xff1b;就我们 Java 程序员来说&#xff0c;多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基…

跳跳鱼视频处理大师Mac版,使用方法介绍

现在是短视频的时代&#xff0c;每个人都想通过视频来实现自己的营销目的&#xff0c;因此对于视频的使用非常的频繁&#xff0c;这也要求这方面的从业者需要掌握一些基础的视频处理技巧&#xff0c;这对我们在工作上会有很大的帮助。但是专门用于苹果电脑上的音频处理软件非常…

狂野java-MongoDB基本使用

NoSQL&#xff08;非关系型数据库&#xff09; 为什么使用NoSQL 扩容&#xff0c;操作简单分布式计算易扩展&#xff0c;因为 数据之间无关系无需建立字段&#xff0c;自定义数据格式支持大数据量&#xff0c;高性能&#xff08;细粒度Cache&#xff09; 缺点 有限的查询是…

Python3+Selenium2完整的自动化测试实现之旅(二):IE和Chrome浏览器驱动配置

引言 如果你正在进行自动化测试&#xff0c;那么你一定知道浏览器驱动是必不可少的。但是&#xff0c;不同的浏览器驱动配置可能会让你感到头疼。 在我前一篇文章中&#xff0c;我们已经学习了如何搭建自动化测试环境。今天&#xff0c;我将为大家分享如何配置IE和Chrome浏览…

一个合格的测试员需要注意些什么,测试总结

目录 前言&#xff1a; 沟通 用例设计 仔细检查你的文档 积累你的技术 发现问题之后 测试应该学些什么 职责决定价值 敏捷测试 敏捷测试人员的定义 结尾&#xff1a; 前言&#xff1a; 测试计划是软件测试流程中的一个重要步骤&#xff0c;它涉及到对软件产品进行全面的测试…

网络安全自学规划

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

集成运算放大器的线性应用

目录 1、运算电路基本认识 2、反向比例、同相比例运算电路 3、电压跟随器&#xff08;同相比例的特例&#xff09; 4、差分比例运算电路&#xff08;减法运算电路&#xff09; 5、积分、微分运算电路 1、运算电路基本认识 &#xff08;集成运放工作在线性区&#xff09; 两…

win10、cmake、vs2015编译ncnn和protobuf(release和debug)

一、下载或安装 1.下载cmake&#xff08;Download | CMake&#xff09;&#xff0c;并安装&#xff0c;常规安装即可&#xff1b; 2.下载protobuf&#xff08;https://github.com/google/protobuf/archive/v3.11.2.zip&#xff09; 3.下载ncnn(GitHub - Tencent/ncnn: ncnn …

手动创建Spring Boot 2.x项目

创建SpringBoot可以选择手动 也可以利用官方脚手架, 对于新手来说, 先手动创建是个不错的选择 环境说明 JDK1.8 或以上Gradle 4 or Maven 3.2IDE、Eclipse 配置步骤 注意&#xff0c;拉包慢的记得配置一下阿里源, 否则浪费时间, 配置阿里源再 Maven快速入门 这篇文章里面有 …

计算机毕业论文内容参考|基于java的数据处理分析系统的设计与实现

文章目录 导文文章重点前言数据处理分析系统的概念、定义和作用范围内容与目标需求与约束相关技术与方法介绍技术分析技术设计技术实现总结与展望本文总结后续工作展望导文 计算机毕业论文内容参考|基于java的数据处理分析系统的设计与实现 文章重点 前言 建立基于Java的数据…

细谈2023年,想要靠做软件测试获得高薪,是否还是有机会!

目录 前言&#xff1a; 01、做测试&#xff0c;真的重要吗&#xff1f; 02、2023年软件测试行业发展如何&#xff1f; 03、零基础&#xff0c;能转行做软件测试吗&#xff1f; 04、2023年软件测试行业发展如何&#xff1f; 结尾&#xff1a; 前言&#xff1a; 时间过得很快&…

使用koa2搭建后端服务器

目录 第一步 第二步 第三步 第四步 第五步 流程说明 1.配置连接数据库 2.添加Schema模型 3.配置路由接口 第一步 npm i -g koa-generator 第二步 koa2 server 第三步 cd server && npm install 第四步 将服务器拖进编译器运行 npm run dev 在浏览器输入…

【高危】用友 U8 Cloud、GRP-U8、A++V8.31存在多个高危漏洞

漏洞描述 用友 U8 Cloud、GRP-U8 是用友软件公司开发的提供企业资源管理解决方案的产品。 用友 U8 Cloud 存在3个高危漏洞&#xff0c;分别为LoggingConfigServlet反序列化漏洞、BeanShell远程代码执行漏洞、commons-beanutils 远程代码执行漏洞。 用友 GRP-U8 存在3个高危漏…

爆肝2个月,最新、最全前端框架前置课强势上线

今天是6月7日星期三 也是高考的第一天 黑马祝高考学生 考的全会&#xff01;蒙的全对&#xff01; 高考之后&#xff0c;大家都是成年人啦 今天&#xff0c;我们聊点 成年人 程序员的话题 2023年已经6月了 大家存到钱了吗 找到工作了吗&#xff1f; 薪资多少&#xff1f…