LeetCode-173 Binary Search Tree Iterator

博客围绕二叉搜索树(BST)实现迭代器展开。需实现 next() 和 hasnext() 两个操作,前者要在 O(1) 时间内查找最小数值,后者判断是否还有最小值。给出两种解题思路,一是前序遍历保存结点数值,二是用 stack 保存左孩子结点。还分析了时间和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.

Calling next() will return the next smallest number in the BST.

 

题目大意

给定一个二叉搜索树(BST),基于该搜索树实现两个操作:

next():要求在时间复杂度O(1)内查找树中最小的数值,下次一查找便查找第二小的数值,以此类推。

hasnext():是否还有下次查找的最小值(即是否该二叉查找树已遍历一遍)

 

示例

E1

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

 

解题思路

Solution1:简单的前序遍历二叉树,用vector一次保存结点数值,在进行操作时可以实现O(1)的复杂度操作。

Solution2:借鉴LeetCode@xcv58的思路,利用一个stack保存当前节点的所有的左孩子结点,每次操作之后将操作结点的右孩子结点保存到stack中,能实现空间复杂度为O(h)(h为树的高度),但查询的操作不为O(1)。

 

复杂度分析

时间复杂度:O(1\O(h))

空间复杂度:O(n\O(h))

 

代码1

/**
 * 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 {
public:
    BSTIterator(TreeNode* root) {
        init(root);
    }
    
    void init(TreeNode* root) {
        if(root == NULL)
            return;
        
        init(root->left);
        node.push_back(root->val);
        init(root->right);        
    }
    
    /** @return the next smallest number */
    int next() {
        int res = node[0];
        node.erase(node.begin());
        return res;
    }
    
    /** @return whether we have a next smallest number */
    bool hasNext() {
        return (node.size() > 0 ? true : false);
    }
    
private:
    vector<int> node;
};

/**
 * 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

class BSTIterator {
    stack<TreeNode *> myStack;
public:
    BSTIterator(TreeNode *root) {
        pushAll(root);
    }

    /** @return whether we have a next smallest number */
    bool hasNext() {
        return !myStack.empty();
    }

    /** @return the next smallest number */
    int next() {
        TreeNode *tmpNode = myStack.top();
        myStack.pop();
        pushAll(tmpNode->right);
        return tmpNode->val;
    }

private:
    void pushAll(TreeNode *node) {
        for (; node != NULL; myStack.push(node), node = node->left);
    }
};

 

转载于:https://www.cnblogs.com/heyn1/p/10955195.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值