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

你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。

(一)dfs_LNR

class BSTIterator:def __init__(self, root: TreeNode):def dfs_LNR(rt: TreeNode) -> None:if rt:dfs_LNR(rt.left)self.vals.append(rt.val)dfs_LNR(rt.right)self.vals = []self.vi = 0dfs_LNR(root)def next(self) -> int:res = self.vals[self.vi]self.vi += 1return resdef hasNext(self) -> bool:return self.vi < len(self.vals)
class BSTIterator:   def __init__(self, root:TreeNode):def dfs_LNR(rt:TreeNode) -> None:if rt:dfs_LNR(rt.left)self.vals.append(rt.val)dfs_LNR(rt.right)self.vals= []self.vi =0dfs_LNR(root)def next(self) -> int:res = self.vals[self.vi]self.vi +=1return resdef hasNext(self) -> bool:return self.vi<len(self.vals)
class BSTIterator:def __init__(self,root:TreeNode):def dfs_LNR(rt: TreeNode) -> None:if rt:dfs_LNR(rt.left)self.vals.append(rt.val)dfs_LNR(rt.right)self.vals=[]self.vi =0dfs_LNR(root)def next(self) -> int:res = self.vals[self.vi]self.vi +=1return resdef hasNext(self) -> bool:return self.vi <len(self.vals)
class BSTIterator:def __init__(self,root:TreeNode):def dfs_LNR(rt: TreeNode) ->None:if rt:dfs_LNR(rt.left)self.vals.append(rt.val)dfs_LNR(rt.right)self.vals = []self.vi =0dfs_LNR(root)def next(self) -> int:res=self.vals[self.vi]self.vi +=1return resdef hasNext(self) -> bool:return self.vi< len(self.vals)

C++

前言
根据二叉搜索树的性质,不难发现,原问题等价于对二叉搜索树进行中序遍历。因此,我们可以采取与「94. 二叉树的中序遍历」类似的方法来解决这一问题。

下面基于「94. 二叉树的中序遍历的官方题解」,给出本题的两种解法。读者将不难发现两篇题解的代码存在诸多相似之处。

方法一:扁平化
我们可以直接对二叉搜索树做一次完全的递归遍历,获取中序遍历的全部结果并保存在数组中。随后,我们利用得到的数组本身来实现迭代器。

class BSTIterator {
private:void inorder(TreeNode* root, vector<int>& res) {if (!root) {return;}inorder(root->left, res);res.push_back(root->val);inorder(root->right, res);}vector<int> inorderTraversal(TreeNode* root) {vector<int> res;inorder(root, res);return res;}vector<int> arr;int idx;
public:BSTIterator(TreeNode* root): idx(0), arr(inorderTraversal(root)) {}int next() {return arr[idx++];}bool hasNext() {return (idx < arr.size());}
};

2021-09-08173. 二叉搜索树迭代器 栈相关推荐

  1. 173. 二叉搜索树迭代器(二叉搜索树+栈)

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

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

    实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象 ...

  3. LeetCode 653. 两数之和 IV - 输入 BST(二叉搜索树迭代器双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 案例 1: 输入: 5/ \3 6/ \ ...

  4. LeetCode 173. 二叉搜索树迭代器(中序遍历)

    文章目录 1. 题目信息 2. 二叉树中序遍历 1. 题目信息 实现一个二叉搜索树迭代器.你将使用二叉搜索树的根节点初始化迭代器. 调用 next() 将返回二叉搜索树中的下一个最小的数. 示例: B ...

  5. 173. 二叉搜索树迭代器/94. 二叉树的中序遍历/145. 二叉树的后序遍历/98. 验证二叉搜索树

    2020-05-12 1.题目描述 二叉搜索树迭代器 2.题解 对于二叉搜索树而言,进行中序遍历就可以得到其有序序列,我们可以先对树进行遍历,将结果保存在 vector中,然后进行计算即可. 3.代码 ...

  6. 剑指 Offer II 055. 二叉搜索树迭代器

    链接:剑指 Offer II 055. 二叉搜索树迭代器 题解: /*** Definition for a binary tree node.* struct TreeNode {* int val ...

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

    173. 二叉搜索树迭代器 实现一个二叉搜索树迭代器.你将使用二叉搜索树的根节点初始化迭代器. 调用 next() 将返回二叉搜索树中的下一个最小的数. 示例: BSTIterator iterato ...

  8. LeetCode 1586. 二叉搜索树迭代器 II(数组+栈)

    文章目录 1. 题目 2. 解题 1. 题目 实现二叉搜索树(BST)的中序遍历迭代器 BSTIterator 类: BSTIterator(TreeNode root) 初始化 BSTIterato ...

  9. leetcode算法题--二叉搜索树迭代器

    题目链接:https://leetcode-cn.com/problems/binary-search-tree-iterator/ 1.排序 将树元素保存到数组中,再对其排序. class BSTI ...

  10. 每日一题:leetcode173.二叉搜索树迭代器

    题目描述 题目分析 更加地觉得编程重要的不在于如何写代码,用什么具体的技巧,编码本身只是一种将思维呈现的方式,但是如果思维是不清晰的,那么就算懂得再多的编码的奇技淫巧也是没有什么帮助的.相反,如果有一 ...

最新文章

  1. 澎思科技马原:AI安防竞争还未结束,落地进入后发优势时代 | MEET2020
  2. UVA 1524 - Hot or Cold?(数学)
  3. c++如何输入数组_从一个数组中找出 N 个数,其和为 M 的所有可能最 nice 的解法...
  4. mysql if selected_初识MySQL
  5. 焦头烂额一个上午还是搞不定,跪地相求大家,朋友帮忙啊。。。
  6. DataX Hdfs HA(高可用)配置支持
  7. springboot整合持久层技术(mysql驱动问题)
  8. excel比对两列数据
  9. ESP8285+WS2812+MAX9814制作的音乐律动氛围灯
  10. 酒业头条信息流投放评估
  11. js递归遍历树形json数据
  12. 云服务器超级鸟,超级鸟的自述_A3_新浪游戏_新浪网
  13. win10的ie保存html文件夹,win10系统IE缓存文件夹在哪里,教您IE缓存文件在哪里
  14. android模拟器转方向,如何旋转Android模拟器显示?
  15. 用户分析(AARRR)
  16. vulnhub-2much
  17. Linux查看被拦截的日志,imperva拦截日志的实时报警
  18. UI库你应该知道的基础(超实用)
  19. 运维级医院PACS系统全套源代码
  20. C语言文件操作——数据文件类型、文件判断、文件缓冲区详解

热门文章

  1. 两台200smart以太网通讯_S7-200 SMART PLC之间如何实现以太网通信?(附接线图)
  2. KT:一款可提升Kubernetes开发效率的免费工具
  3. Redis 之 简单备份还原
  4. tf.nn的conv2d卷积与max_pool池化
  5. Ubuntu系统下面软件安装更新命令
  6. Unity3D使用经验总结 编辑器扩展篇
  7. 连接 mysql 数据库失败频繁的原因探秘
  8. Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议
  9. python基本编程技巧_Python编程小白入门技巧,从入门到精通只需一个月。
  10. java中Map,List与Set的区别