• leetcode做题笔记173. 二叉搜索树迭代器


    实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器

    • BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。
    • boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。
    • int next()将指针向右移动,然后返回指针处的数字。

    注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。

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

    示例:

    输入
    ["BSTIterator", "next", "next", "hasNext", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
    [[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
    输出
    [null, 3, 7, true, 9, true, 15, true, 20, false]
    
    解释
    BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
    bSTIterator.next();    // 返回 3
    bSTIterator.next();    // 返回 7
    bSTIterator.hasNext(); // 返回 True
    bSTIterator.next();    // 返回 9
    bSTIterator.hasNext(); // 返回 True
    bSTIterator.next();    // 返回 15
    bSTIterator.hasNext(); // 返回 True
    bSTIterator.next();    // 返回 20
    bSTIterator.hasNext(); // 返回 False
    

    提示:

    • 树中节点的数目在范围 [1, 105] 内
    • 0 <= Node.val <= 106
    • 最多调用 105 次 hasNext 和 next 操作

    进阶:

    • 你可以设计一个满足下述条件的解决方案吗?next() 和 hasNext() 操作均摊时间复杂度为 O(1) ,并使用 O(h) 内存。其中 h 是树的高度。

    思路一:中序遍历

    c++解法

    1. class BSTIterator {
    2. private:
    3. TreeNode* root;
    4. vector<int> t;
    5. int cnt;
    6. public:
    7. BSTIterator(TreeNode* root) : root(root), cnt(0) {
    8. stack s;
    9. if (root == nullptr) return;
    10. while (root || !s.empty()) {
    11. while (root) {
    12. s.push(root);
    13. root = root->left;
    14. }
    15. if (!s.empty()) {
    16. root = s.top();
    17. s.pop();
    18. t.emplace_back(root->val);
    19. root = root->right;
    20. }
    21. }
    22. }
    23. int next() {
    24. return cnt < t.size() ? t[cnt++] : 0;
    25. }
    26. bool hasNext() {
    27. return cnt < t.size();
    28. }
    29. };

    分析:

    本题可转换为求二叉树的中序遍历,利用栈来存储二叉树节点,先放入二叉树左子树,当左子树放完后再放入右子树,输出的时候根据栈中节点存放位置来输出,时间复杂度为O(n),空间复杂度为O(n)

    总结:

    本题考察对二叉树中序遍历的应用,利用栈来存储节点可使后面查找时的时间复杂度降低

  • 相关阅读:
    Java开发从入门到精通(一):Java的十大经典排序算法
    大一作业HTML网页作业 HTML CSS制作二十四节气网页
    Vite项目构建chrome extension,实现多入口
    牛客练习赛101
    Spock单元测试框架介绍及在美团优选的实践___第一章
    Redis
    市场调查中的信度和效度分析原理及python实现示例
    数值分析 | 常见数据插值方法
    【方向盘】Java EE几十种技术,“活着的”还剩几何(企业应用技术篇)
    携创教育:自考本科和成考本科区别在哪?本科自考和成考哪个含金量高点?
  • 原文地址:https://blog.csdn.net/si_mple_/article/details/133832527