LeetCode 173: 二叉搜索树迭代器

LeetCode 173: 二叉搜索树迭代器

题目描述

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

调用 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) 内存,其中 h 是树的高度。
你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 中至少存在一个下一个最小的数。

解题

中序遍历

    先不管提示说的内容,只完成判以及返回下一个最小的数以及判断是否存在这个数,只需要对二叉搜索树进行中序遍历,并将遍历结果保存到数组中,这样得到了由小到大排列的所有元素,每次调用next()函数时,返回当前索引的元素并递增索引,如果索引值到达数组边界则不存在下一个最小的数,该方法时间复杂度为 O ( 1 ) O(1) O(1),但使用 O ( N ) O(N) O(N)的内存。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class BSTIterator {
private:
    vector<int> vals;
    int cur_pos;
public:
    BSTIterator(TreeNode* root):cur_pos(0) {
        stack<TreeNode *> nodes;
        while (!nodes.empty() || root){
            if (root){
                nodes.push(root);
                root = root->left;
            }
            else{
                root = nodes.top();
                nodes.pop();
                vals.emplace_back(root->val);
                root = root->right;
            }
        }
    }
    
    /** @return the next smallest number */
    int next() {
        return vals[cur_pos++];
    }
    
    /** @return whether we have a next smallest number */
    bool hasNext() {
        return cur_pos < vals.size();
    }
};

/**
 * 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()函数构造成中序遍历的循环体,每次调用都遍历当前节点开始到左子树的最左边节点,占用最大内存只有 O ( h ) O(h) O(h)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class BSTIterator {
private:
    stack<TreeNode *> nodes;
    TreeNode *cur_node;
    int next_val;
public:
    BSTIterator(TreeNode* root):cur_node(root) {
    }
    
    /** @return the next smallest number */
    int next() {
        while (cur_node){
            nodes.push(cur_node);
            cur_node = cur_node->left;
        }
        cur_node = nodes.top();
        nodes.pop();
        next_val = cur_node->val;
        cur_node = cur_node->right;
        return next_val;
    }
    
    /** @return whether we have a next smallest number */
    bool hasNext() {
        return !nodes.empty() || cur_node!=NULL;
    }
};

/**
 * 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();
 */
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class BSTIterator {
private:
    TreeNode *cur_node;
    stack<TreeNode *> nodes;
public:
    BSTIterator(TreeNode* root) {
        while (root){
            nodes.push(root);
            root = root->left;
        }
    }
    
    /** @return the next smallest number */
    int next() {
        cur_node = nodes.top();
        nodes.pop();
        if (cur_node->right){
            nodes.push(cur_node->right);
            while (nodes.top()->left)
                nodes.push(nodes.top()->left);
        }
        return cur_node->val;
    }
    
    /** @return whether we have a next smallest number */
    bool hasNext() {
        return !nodes.empty();
    }
};

/**
 * 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();
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值