
LeetCode 173. Binary Search Tree Iterator
初始化:当创建BSTIterator对象时,只需将根节点加到堆中。 hasNext():检查堆是否为空。如果堆不为空,则说明存在下一个最小值;否则,返回false。 next():从堆中弹出当前最小值节点。然后将该节点的右子树节点按顺序依次压入堆中。返回当前最小值节点的值。
发布日期:2025-04-04 23:03:17
浏览次数:12
分类:精选文章
本文共 1220 字,大约阅读时间需要 4 分钟。
二叉搜索树的迭代器(BSTIterator)是一种常见的数据结构,它能够按照递增顺序遍历二叉搜索树的所有节点值。通过这种方式,可以避免传统的递归方法可能带来的栈溢出问题。
核心思路
BSTIterator的实现主要基于一个堆(本文中的并非JAVA中的堆,而是基于LIFO的栈结构)来模拟递归遍历。具体来说,迭代器会在每个节点弹出堆顶元素,并将该节点的右子树节点递归地压入堆中。以下是详细的步骤:
这种方法与二叉搜索树的第二种遍历(类似于先访问左子树,后访问右子树)的顺序有关。
实现代码
#includeusing namespace std;class BSTIterator {private: stack stk;public: BSTIterator(TreeNode* root) { pushNode(root); } bool hasNext() { return !stk.empty(); } int next() { TreeNode* min = stk.top(); stk.pop(); pushNode(min->right); return min->val; } void pushNode(TreeNode* root) { while (root != NULL) { stk.push(root); root = root->left; } }};
示例与测试
假设输入二叉搜索树为:
5 0 \ / 10 9 / 11
遍历结果应该是:0,0(假设根节点为5可能有多个值),5,9,10,11。
在代码运行过程中,堆的状态会在每次调用next()时有所变化:
- 初始:堆中只有根节点5。
- 第一次next():弹出5,将其右子树(10)推入堆。
- 第二次next():弹出10,将其右子树(9)推入堆。
- 第三次next():弹出9,将其右子树(11)推入堆。
- 第四次next():弹出11,堆为空,此时无法继续。
总结
BSTIterator通过使用堆来实现递归遍历,避免了传统递归方法中的栈溢出问题。这种方法在时间复杂度上与O(n)的线性扫描相当,同时空间复杂度也为O(h),其中h是树的高度。
发表评论
最新留言
很好
[***.229.124.182]2025年04月17日 03时10分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
kubernetes混合云平台运维实战项目分享
2023-01-29
Kubernetes灰度发布实战:滚动更新的奥秘与策略,带你领略无缝升级的艺术
2023-01-29
kubernetes社区项目生态概览
2023-01-29
Kubernetes网络插件使用详解
2023-01-29
Kubernetes调度单位Pod
2023-01-29
Kubernetes部署Dashboard实战
2023-01-29
Kubernetes集群升级实战
2023-01-29
KuiperInfer深度学习推理框架-源码阅读和二次开发(3):计算图
2023-01-29
KxMenu下拉菜单
2023-01-29
KXML2部分详解(J2ME)
2023-01-29
KXML解释本地或网络上的XML文件
2023-01-29
Lambda 实现超强排序
2023-01-30
lambda表达式与匿名内部类与双冒号(::)
2023-01-30
Lammp安装过程
2023-01-30
lamp 一键安装
2023-01-30
Lamp(Fpm-Php)基本配置
2023-01-30
laradock 安装使用 kafka
2023-01-30