当前位置: 首页 > news >正文

LC.173 | 二叉搜索树迭代器 | 树 | 中序展开/栈模拟

输入:BST 根节点root,构造BSTIterator

要求:
实现一个按中序遍历输出 BST 的迭代器:

  • next():返回下一个最小值
  • hasNext():是否还有下一个元素

输出:按题意实现类方法(next/hasNext)。


思路:

思路 A:中序遍历“展开成线性表”

核心就是一句话:

BST 中序遍历 = 递增序列
先把整棵树中序遍历一遍,把结果按顺序塞进链表/数组,然后迭代器只是在这个线性结构上移动指针。

  1. 构造时inorder(root),按中序顺序把每个节点值 append 到单链表尾部。
  2. cur指向链表头(第一个最小值)。
  3. next()返回cur->val并前进。
  4. hasNext()cur != nullptr

优点:

  • 写起来直观,next/hasNext都是 O(1)。

缺点:

  • 构造函数要遍历整棵树,时间 O(N)。
  • 额外存了 N 个节点值,空间 O(N)。
  • 题目进阶想要更省空间(典型答案是 O(H))。

思路 B:用栈模拟中序遍历(更优解的核心思想)

迭代器本质是:每次只走到“下一个该访问的中序节点”,不提前把整棵树铺开。

维护一个栈stk

  • 构造时:把root的整条左链压栈(走到最左)。
  • next()
    1. 弹出栈顶x(当前最小)
    2. 如果x有右子树,把x->right的整条左链压栈
    3. 返回x->val
  • hasNext():看栈空不空

复杂度:

  • 思路 A(暴力)

    • 构造:O(N)
    • next/hasNext:O(1)
    • 空间:O(N)
  • 思路 B(栈模拟)

    • 构造:O(H)
    • next:均摊 O(1)(每个节点最多入栈出栈一次)
    • 空间:O(H)

//思路A 暴力classBSTIterator{public:BSTIterator(TreeNode*root){dummy=newListNode(0);tail=dummy;inorder(root);cur=dummy->next;}intnext(){intval=cur->val;cur=cur->next;returnval;}boolhasNext(){returncur!=nullptr;}private:structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};ListNode*dummy;ListNode*tail;ListNode*cur;voidinorder(TreeNode*node){if(node==nullptr)return;inorder(node->left);tail->next=newListNode(node->val);tail=tail->next;inorder(node->right);}};//思路B 栈模拟classBSTIterator{public:BSTIterator(TreeNode*root){pushLeftChain(root);}intnext(){TreeNode*node=st.top();st.pop();intret=node->val;// 下一批候选:node 的右子树的最左链if(node->right){pushLeftChain(node->right);}returnret;}boolhasNext(){return!st.empty();}private:stack<TreeNode*>st;voidpushLeftChain(TreeNode*node){while(node){st.push(node);node=node->left;}}};
http://www.jsqmd.com/news/125575/

相关文章:

  • 2025最新内容整合营销、新媒体广告代运营、达人媒介采买、电商直播、流量投放首要推荐紫龙数科:全域赋能品牌增长,这家服务商实力领跑 - 全局中转站
  • Java毕设选题推荐:基于springboot的篮球管理系统的设计与实现基于springboot的篮球论坛系统设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 2025广州最新流量投放品牌TOP5评测!国内优质服务商威榜单发布,技术赋能品牌增长新生态 - 全局中转站
  • 程序员的伪年薪百万还能持续多久?
  • EconMate——面向大学生的经济学老师
  • springboot基于Java的大学校园水电管理系统的设计与实现
  • 基于Springboot企业进销存管理系统【附源码+文档】
  • 畅联云和智能物联中台UCC的关系
  • 12月22日日记
  • 深度学习<2>从“看单帧”到“懂故事”:视频模型的帧链推理,藏着机器读懂时间的秘密
  • 工业现场总线替代方案:SerialPort技术可行性分析
  • 多通道小动物代谢监控系统 小动物代谢监测系统 小动物代谢检测系统
  • 基于Hadoop的社区流浪动物救助领养系统
  • 乙酰化糖基化苏氨酸衍生物——糖肽合成与药物研发的关键中间体 CAS号: 878483-13-7
  • 专用蚊子苍蝇检测数据集(含背景样本):适用于目标检测任务
  • AI论文写作工具排名:8个网站测评,降重与创作功能解析
  • 基于Springboot社区物资申报系统【附源码+文档】
  • OpenMV识别物体结合WiFi传输的安防监控:项目实践
  • 基于python的网上商城比价系统(源码+vue+前后端分离)
  • 2025广州最新达人媒介采买服务商TOP5评测!国内优质品牌权威榜单发布,重构品牌营销增长新生态 - 全局中转站
  • AI论文降重与写作工具推荐:8个热门网站详细对比
  • 饮食饮水代谢检测系统 呼吸能量饮食饮水代谢检测系统 大鼠代谢系统 小鼠代谢系统
  • RISC与CISC思想体现:arm64 amd64原理级对比
  • 【毕业设计】基于springboot的篮球管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • AUTOSAR网络管理节点状态机配置的实战操作指南
  • paperzz AI:把毕业论文从 “渡劫” 变成 “一键通关”?这届毕业生偷偷用它省了 300 小时
  • 网络流算法
  • es面试题从零实现:初级岗位应知应会汇总
  • [技术讨论] 【C语言实战经验6】什么是防御式编程?请看代码
  • 基于SpringBoot的青年大学习记录管理系统的设计与实现