Binary Search Tree Iterator

本文详细阐述了如何改进BST迭代器的实现方式,通过使用栈结构优化hasNext与next方法的复杂度,达到O(1)的时间复杂度。重点讨论了避免修改原始树结构,仅使用额外O(h)的空间来暂存中间状态,从而实现在中序遍历基础上的高效迭代。

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

这道题目表述的不太好,容易造成误解,我就误解了2次。。。“next smallest number”其实指的就是树中的最小元素,所以说白了就是每次都返回最小元素即可。

所以一个很直觉的解法就是:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class BSTIterator {
public:
    TreeNode* root;
    BSTIterator(TreeNode *root) {
        this->root=root;
    }

    /** @return whether we have a next smallest number */
    bool hasNext() {
        if(root)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    /** @return the next smallest number */
    int next() {
        TreeNode* par=NULL;
        TreeNode* tmp=root;
        while(tmp->left)
        {
            par=tmp;
            tmp=tmp->left;
        }
        int res=tmp->val;
        if(par==NULL)
        {
            root=root->right;
        }
        else
        {
            par->left=tmp->right;
        }
        return res;
        
    }
};

/**
 * Your BSTIterator will be called like this:
 * BSTIterator i = BSTIterator(root);
 * while (i.hasNext()) cout << i.next();
 */

上述解法修改了原来的树,未使用额外存储空间,hasNext复杂度为O(1),但是next复杂度为O(logN),不满足题目要求的O(1)复杂度。


注意到其实本题与树的中序遍历有异曲同工之妙,只不过这里需要“暂存中间状态”,而在非递归的中序遍历中使用了栈,这是天然的“中间状态暂存处”。这样一来,使用了额外O(h)的存储空间,做到了hasNext与next的复杂度均达到了O(1)。注意,next复杂度之所以是O(1)是因为,树中的每个节点恰好只进入一次栈,所以在调用n次next输出全部节点后,总的进栈操作是n,所以平均每次next操作进栈一次,所以是O(1)

改进的解法如下:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class BSTIterator {
public:
    stack<TreeNode*> mstack;
    BSTIterator(TreeNode *root) {
        while(root)
        {
            mstack.push(root);
            root=root->left;
        }
    }

    /** @return whether we have a next smallest number */
    bool hasNext() {
        if(mstack.empty())
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    /** @return the next smallest number */
    int next() {
        TreeNode* tmp=mstack.top();
        mstack.pop();
        int res=tmp->val;
        if(tmp->right)
        {
            tmp=tmp->right;
            while(tmp)
            {
                mstack.push(tmp);
                tmp=tmp->left;
            }
        }
        return res;
    }
};

/**
 * Your BSTIterator will be called like this:
 * BSTIterator i = BSTIterator(root);
 * while (i.hasNext()) cout << i.next();
 */


05-20
### LeetCode 510: Binary Search Tree Iterator LeetCode Problem 510 is titled **Binary Search Tree Iterator**, which involves designing an iterator over a binary search tree (BST). The goal is to implement the `BSTIterator` class that initializes with the root of a BST and supports two operations: 1. `next()`: Returns the next smallest number in the BST. 2. `hasNext()`: Returns whether there exists a next smallest number. The solution should run in average O(1) time complexity per operation, using O(h) memory where h is the height of the tree[^1]. #### Approach Using Inorder Traversal To solve this problem efficiently, one can use an iterative inorder traversal approach leveraging a stack data structure. This method ensures that each node's value is processed in ascending order due to the properties of a BST. Here’s how it works: - Initialize a stack during construction (`__init__`) and populate it by traversing as far left from the given root as possible. - For every call to `next()`, pop the top element off the stack, then push all its right subtree nodes onto the stack following the same rule—traverse down the leftmost path starting at any new node added. - Use the `hasNext()` function simply to check if the stack still contains elements; if so, more values remain unprocessed. Below is Python code implementing such functionality: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class BSTIterator: def __init__(self, root: TreeNode): self.stack = [] self._leftmost_in_order(root) def _leftmost_in_order(self, root: TreeNode): while root: self.stack.append(root) root = root.left def next(self) -> int: top_node = self.stack.pop() if top_node.right: self._leftmost_in_order(top_node.right) return top_node.val def hasNext(self) -> bool: return len(self.stack) > 0 ``` This implementation guarantees both methods operate within acceptable performance bounds specified earlier[^2]. Additionally, since stacks only store references along paths leading toward potential future results rather than entire trees themselves, space usage remains proportional solely based on heights instead of total sizes involved here too!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值