• 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-php-net-python-图书馆选择计算机毕业设计程序
    《HTML+CSS+JavaScript》之第18章 图片样式
    java刷题笔记2
    Java IO流
    SSM项目整合 文件上传
    扑克牌顺子题
    大规模MIMO通信系统的发射端采用混合波束成形(Matlab代码实现)
    14 shell编程入门-hello world
    Mysql 知识点
    STL容器
  • 原文地址:https://blog.csdn.net/si_mple_/article/details/133832527