2021-09-08173. 二叉搜索树迭代器 栈
实现一个二叉搜索树迭代器类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. 二叉搜索树迭代器 栈相关推荐
- 173. 二叉搜索树迭代器(二叉搜索树+栈)
实现一个二叉搜索树迭代器.你将使用二叉搜索树的根节点初始化迭代器. 调用 next() 将返回二叉搜索树中的下一个最小的数. 示例: BSTIterator iterator = new BSTIte ...
- leetcode 173. 二叉搜索树迭代器
实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象 ...
- LeetCode 653. 两数之和 IV - 输入 BST(二叉搜索树迭代器双指针)
文章目录 1. 题目 2. 解题 1. 题目 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 案例 1: 输入: 5/ \3 6/ \ ...
- LeetCode 173. 二叉搜索树迭代器(中序遍历)
文章目录 1. 题目信息 2. 二叉树中序遍历 1. 题目信息 实现一个二叉搜索树迭代器.你将使用二叉搜索树的根节点初始化迭代器. 调用 next() 将返回二叉搜索树中的下一个最小的数. 示例: B ...
- 173. 二叉搜索树迭代器/94. 二叉树的中序遍历/145. 二叉树的后序遍历/98. 验证二叉搜索树
2020-05-12 1.题目描述 二叉搜索树迭代器 2.题解 对于二叉搜索树而言,进行中序遍历就可以得到其有序序列,我们可以先对树进行遍历,将结果保存在 vector中,然后进行计算即可. 3.代码 ...
- 剑指 Offer II 055. 二叉搜索树迭代器
链接:剑指 Offer II 055. 二叉搜索树迭代器 题解: /*** Definition for a binary tree node.* struct TreeNode {* int val ...
- Java实现 LeetCode 173 二叉搜索树迭代器
173. 二叉搜索树迭代器 实现一个二叉搜索树迭代器.你将使用二叉搜索树的根节点初始化迭代器. 调用 next() 将返回二叉搜索树中的下一个最小的数. 示例: BSTIterator iterato ...
- LeetCode 1586. 二叉搜索树迭代器 II(数组+栈)
文章目录 1. 题目 2. 解题 1. 题目 实现二叉搜索树(BST)的中序遍历迭代器 BSTIterator 类: BSTIterator(TreeNode root) 初始化 BSTIterato ...
- leetcode算法题--二叉搜索树迭代器
题目链接:https://leetcode-cn.com/problems/binary-search-tree-iterator/ 1.排序 将树元素保存到数组中,再对其排序. class BSTI ...
- 每日一题:leetcode173.二叉搜索树迭代器
题目描述 题目分析 更加地觉得编程重要的不在于如何写代码,用什么具体的技巧,编码本身只是一种将思维呈现的方式,但是如果思维是不清晰的,那么就算懂得再多的编码的奇技淫巧也是没有什么帮助的.相反,如果有一 ...
最新文章
- 澎思科技马原:AI安防竞争还未结束,落地进入后发优势时代 | MEET2020
- UVA 1524 - Hot or Cold?(数学)
- c++如何输入数组_从一个数组中找出 N 个数,其和为 M 的所有可能最 nice 的解法...
- mysql if selected_初识MySQL
- 焦头烂额一个上午还是搞不定,跪地相求大家,朋友帮忙啊。。。
- DataX Hdfs HA(高可用)配置支持
- springboot整合持久层技术(mysql驱动问题)
- excel比对两列数据
- ESP8285+WS2812+MAX9814制作的音乐律动氛围灯
- 酒业头条信息流投放评估
- js递归遍历树形json数据
- 云服务器超级鸟,超级鸟的自述_A3_新浪游戏_新浪网
- win10的ie保存html文件夹,win10系统IE缓存文件夹在哪里,教您IE缓存文件在哪里
- android模拟器转方向,如何旋转Android模拟器显示?
- 用户分析(AARRR)
- vulnhub-2much
- Linux查看被拦截的日志,imperva拦截日志的实时报警
- UI库你应该知道的基础(超实用)
- 运维级医院PACS系统全套源代码
- C语言文件操作——数据文件类型、文件判断、文件缓冲区详解
热门文章
- 两台200smart以太网通讯_S7-200 SMART PLC之间如何实现以太网通信?(附接线图)
- KT:一款可提升Kubernetes开发效率的免费工具
- Redis 之 简单备份还原
- tf.nn的conv2d卷积与max_pool池化
- Ubuntu系统下面软件安装更新命令
- Unity3D使用经验总结 编辑器扩展篇
- 连接 mysql 数据库失败频繁的原因探秘
- Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议
- python基本编程技巧_Python编程小白入门技巧,从入门到精通只需一个月。
- java中Map,List与Set的区别