[leetcode] 173. Binary Search Tree Iterator_implement an iterator over a binary search tree (b-程序员宅基地

技术标签: 算法  C++  leetcode题解  leetcode  职场和发展  

Description

Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.

Calling next() will return the next smallest number in the BST.

Example:
bst-tree

BSTIterator iterator = new BSTIterator(root);
iterator.next();    // return 3
iterator.next();    // return 7
iterator.hasNext(); // return true
iterator.next();    // return 9
iterator.hasNext(); // return true
iterator.next();    // return 15
iterator.hasNext(); // return true
iterator.next();    // return 20
iterator.hasNext(); // return false

Note:

  • next() and hasNext() should run in average O(1) time and uses O(h) memory, where h is the height of the tree.
  • You may assume that next() call will always be valid, that is, there will be at least a next smallest number in the BST when next() is called.

分析

题目的意思是:
实现一个二叉搜索树的遍历迭代器,其中要有next(),hasNext()函数,要求时间复杂度为O(1), 空间复杂度为O(h),h为树的高度。

-这道题我不会,结果看别人的解析,用一个栈就能解决,我要哭了。
初始化的时候,把二叉树遍历root->left压入栈中,
next函数的实现:
把栈顶的元素输出,如果出栈的元素有右分支,把t->right,遍历t->left押入栈中。
hasNext():
判断一下节点是否为空就行了。

  • 如果读者还是不理解,就直接看代码手动模拟吧,栈能够保证遍历按照从小到大输出。

C++实现

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class BSTIterator {
private:
    stack<TreeNode*> s;
public:
    BSTIterator(TreeNode *root) {
        while(root){
            s.push(root);
            root=root->left;
        }
    }

    /** @return whether we have a next smallest number */
    bool hasNext() {
        return !s.empty();
    }

    /** @return the next smallest number */
    int next() {
        TreeNode* t=s.top();
        s.pop();
        int res=t->val;
        if(t->right){
            t=t->right;
            while(t){
                s.push(t);
                t=t->left;
            }
        }
        return res;
    }
};

/**
 * Your BSTIterator will be called like this:
 * BSTIterator i = BSTIterator(root);
 * while (i.hasNext()) cout << i.next();
 */

Python实现

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class BSTIterator:
    def inorder(self, root, res):
        if root is None:
            return 
        self.inorder(root.left, res)
        res.append(root)
        self.inorder(root.right, res)

    def __init__(self, root: Optional[TreeNode]):
        self.res = []
        self.inorder(root,self.res)
        self.idx = 0
    def next(self) -> int:
        if self.idx < len(self.res):
            val = self.res[self.idx].val
            self.idx+=1
            return val



    def hasNext(self) -> bool:
        if self.idx<len(self.res):
            return True
        else:
            return False



# Your BSTIterator object will be instantiated and called as such:
# obj = BSTIterator(root)
# param_1 = obj.next()
# param_2 = obj.hasNext()

参考文献

[LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/w5688414/article/details/86676424

智能推荐

2024年阿里云服务器价格整理:最新促销信息及优惠力度一览!-程序员宅基地

文章浏览阅读919次,点赞19次,收藏21次。在当今这个数据驱动的时代,云服务器已成为许多企业和个人的首选。而在众多云服务提供商中,阿里云凭借其出色的技术实力和稳定的性能,赢得了“良心云”的美誉。那么,阿里云服务器到底多少钱呢?同时,阿里云的经济型e实例云服务器ECS也有多种配置可选,满足不同用户的需求。从2核4G的一年415.73元,到8核32G的一年4299.84元,用户可以根据自己的实际情况选择最合适的配置。,不仅提供了多样化的产品选择,更在性能稳定和性价比上赢得了用户的广泛认可。

Win10+VS2019编译PCL库1.12.0(含gpu)_pcl 1.12eigen-程序员宅基地

文章浏览阅读4.3k次,点赞3次,收藏29次。PCL1.11.1AllInOne里的三方库CMAKE 3.19.2Windows 10EIGEN_ROOT D:/Program Files/PCL 1.11.1/3rdParty/Eigen/eigen3VTK_DIR D:/Program Files/PCL 1.11.1/3rdParty/VTK/lib/cmake/vtk-8.2_pcl 1.12eigen

【隐私合规】个人信息收集的合法性、必要性、被收集者同意、征得被收集者同意的例外、隐私政策优化、间接获取个人信息的要求_征得用户同意前就开始收集个人信息或打开可收集个人信息的权限-程序员宅基地

文章浏览阅读7k次,点赞3次,收藏3次。个人信息收集的合法性、必要性、被收集者同意、征得被收集者同意的例外、隐私政策优化、间接获取个人信息的要求等六方面来探讨个人信息收集的合规化_征得用户同意前就开始收集个人信息或打开可收集个人信息的权限

WPF自学—模仿QQ窗体载入和关闭动画_wpf 流动动画 防qq-程序员宅基地

文章浏览阅读2.6k次。这两天把《WPF编程宝典》这本书的动画相关章节看完了,于是想写个小程序练练手,但是不知道写什么好。看书的时候虽然也把上面的案例照着敲了一遍,但是它们毕竟和实际应用有很大差别,想用到日常项目里也不知道从何下手。刚好看到了一位网友 youngytj 分享的模仿QQ载入和关闭动画的文章,我就跟着学习模仿了一遍,下面来讲讲具体如何实现的。首先分析下我想实现的效果:第一,我打开程序后它从上到下滚动_wpf 流动动画 防qq

Facebook 详解 -程序员宅基地

文章浏览阅读1.4k次。 Facebook 详解 译者:本文译自英文维基百科条目“Facebook”。只翻译了个人觉得对中国互联网从业者有价值的部分。比如有关Facebook相关的法律纠纷,就略去了。中文维基百科只完成了原文2%的翻译。如中文维基百科的志愿者们愿意,请随意使用本文的全部或部分内容充实中文维基百科的相关条目。其他转载,必须遵照维基百科的相关协议,并链接到本文和译言首页。谢谢。Faceboo

HDU 1595-程序员宅基地

文章浏览阅读519次。find the longest of the shortestTime Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1258 Accepted Submission(s): 445Problem Descripti_hdu 1595

随便推点

基于ARM的排他访问原理及应用___ldrexw-程序员宅基地

文章浏览阅读2.1k次,点赞9次,收藏19次。基于ARM的排他访问原理及应用版权声明摘要关键词正文引言资源竞争临界区ARMv7的排他访问同步原语语法排他访问原理排他访问的汇编语言实现排他访问的C语言实现结语参考文献版权声明本文为博主原创文章,未经博主允许不得转载。摘要自操作系统诞生以来,并行编程就是一个值得关注问题。本文以一个全局变量为例,就ARMv7内核处理器中断屏蔽和排他访问两种临界区的实现方式进行了一些讨论,主要阐述了排他访问的...___ldrexw

掌握 TypeScript 核心:从基本类型到面向对象编程,理论详解与Vue3实践运用-程序员宅基地

文章浏览阅读908次,点赞11次,收藏27次。掌握 TypeScript 核心:从基本类型到面向对象编程,理论详解与实战运用。TypeScript在 JavaScript 的基础上添加了静态类型系统、类、接口、模块等高级特性和严格的类型检查机制,旨在提高大型应用的可维护性和开发效率。

python散点图拟合曲线-python – 将曲线拟合到散点图的边界-程序员宅基地

文章浏览阅读1.8k次。我发现问题真的很有趣,所以我决定尝试一下.我不知道pythonic或natural,但我认为我已经找到了一种更准确的方法,可以在使用每个点的信息时将边缘拟合到像您这样的数据集.首先,让我们生成一个看起来像你所展示的随机数据.这个部分可以很容易地跳过,我发布它只是为了使代码完整和可重复.我使用了两个双变量正态分布来模拟那些过度密度,并在其上撒上一层均匀分布的随机点.然后将它们添加到与您类似的线方程中..._jupyter散点图添加拟合线

jtag调试 c语言,[原创]iFPGA-Cable FT2232H Xilinx / Altera / Lattice 三合一JTAG & UART调试器-详细使用说明...-程序员宅基地

文章浏览阅读1.4k次。iFPGA-Cable调试器使用说明全文分为6部分:第0部分:实物、连线及其驱动安装说明第1部分:Xilinx JTAG第2部分:UART第3部分:Altera JTAG第4部分:Lattice JTAG第5部分:相关软件及其Demo附件下载地址第0部分:实物、连线及其驱动安装说明基本特性:Channel A为JTAG,电平1.8~5V,在Xilinx 平台(include ISE 13.2+,V..._ft2232实现fpga

BUG_ON_bug_on(blk_queued_rq(req));-程序员宅基地

文章浏览阅读595次。调试的时候很有用的东西:dump_stack 使用前,先在内核配置中把kernel debug选上:make menuconfig:kernel hacking-->kernel debug 作用:一些内核调用可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。当被调用的时候,它们会引发oops,导致栈的回溯和错误信息_bug_on(blk_queued_rq(req));

基于微信汽车维修保养小程序毕业设计作品成品(2)后台管理系统-程序员宅基地

文章浏览阅读219次。本课题主要目标是设计并能够实现一个基于微信汽车维修保养小程序系统,前台用户使用小程序,小程序使用微信开发者工具开发;后台管理使用基PP+MySql的B/S架构,开发工具使用phpstorm;通过后台录入汽修店信息,录入维修和保养信息,用户通过小程序登录,查看汽修店信息,收藏汽修店,预约维修保养,发起评论等。