ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【LeetCode】C++ :中等题 - 树 173. 二叉搜索树迭代器

2021-02-06 16:01:01  阅读:171  来源: 互联网

标签:right TreeNode int nullptr C++ next 173 LeetCode left


173. 二叉搜索树迭代器

难度中等322

实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。

调用 next() 将返回二叉搜索树中的下一个最小的数。

 

示例:

BSTIterator iterator = new BSTIterator(root);
iterator.next();    // 返回 3
iterator.next();    // 返回 7
iterator.hasNext(); // 返回 true
iterator.next();    // 返回 9
iterator.hasNext(); // 返回 true
iterator.next();    // 返回 15
iterator.hasNext(); // 返回 true
iterator.next();    // 返回 20
iterator.hasNext(); // 返回 false

 

提示:

  • next() 和 hasNext() 操作的时间复杂度是 O(1),并使用 O(h) 内存,其中 是树的高度。
  • 你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 中至少存在一个下一个最小的数。

1、中序遍历 + 数组

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class BSTIterator {
private:
    vector<int> vec;
    int index = 0;
public:
    BSTIterator(TreeNode* root) {
        midTraverse(root, vec);
    }
    
    int next() {
        return vec[index++];
    }

    // hasNext() 函数的作用是:返回一个布尔值,表示二叉搜索树中是否还有元素
    bool hasNext() {
        return index != vec.size();
    }

    void midTraverse(TreeNode* root, vector<int>& res){
        if(root == nullptr){
            return ;
        }
        midTraverse(root->left, res);
        res.push_back(root->val);
        midTraverse(root->right, res);
    }
};

/**
 * Your BSTIterator object will be instantiated and called as such:
 * BSTIterator* obj = new BSTIterator(root);
 * int param_1 = obj->next();
 * bool param_2 = obj->hasNext();
 */

2、栈 + 迭代 + 中序遍历

这题用迭代方式比通常的迭代要多一些思考,在next函数里面,看似中序遍历却不能是中序遍历,因此next值获取的是中序遍历后的较小节点值,因此

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class BSTIterator {
public:
    BSTIterator(TreeNode* root) {
        p = root;
    }
    
    int next() {
        hasNext();
        int res;
        while(p != nullptr || !stk.empty()){
            if(p != nullptr){
                stk.push(p);
                p = p->left;
            }else{
                p = stk.top();
                stk.pop();
                res = p->val;
                p = p->right;
                break;
            }
        }
        return res;
    }
    
    bool hasNext() {
        return p || !stk.empty();
    }
private:
    TreeNode* p;
    stack<TreeNode*> stk;
};

/**
 * Your BSTIterator object will be instantiated and called as such:
 * BSTIterator* obj = new BSTIterator(root);
 * int param_1 = obj->next();
 * bool param_2 = obj->hasNext();
 */

下面这样的获取next() 记一下吧,每次执行next获取的都是中序遍历后的序列值

    int next() {
        hasNext();
        int res;
        while(p != nullptr || !stk.empty()){
            while(p != nullptr){
                stk.push(p);
                p = p->left;
            }
            if(p == nullptr){
                p = stk.top();
                stk.pop();
                res = p->val;
                p = p->right;
                break;
            }
        }
        return res;
    }

 

标签:right,TreeNode,int,nullptr,C++,next,173,LeetCode,left
来源: https://blog.csdn.net/weixin_44566432/article/details/113726485

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有