LeetCode每日一题(173. Binary Search Tree Iterator)

二叉搜索树迭代器实现

Implement the BSTIterator class that represents an iterator over the in-order traversal of a binary search tree (BST):

BSTIterator(TreeNode root) Initializes an object of the BSTIterator class. The root of the BST is given as part of the constructor. The pointer should be initialized to a non-existent number smaller than any element in the BST.
boolean hasNext() Returns true if there exists a number in the traversal to the right of the pointer, otherwise returns false.
int next() Moves the pointer to the right, then returns the number at the pointer.
Notice that by initializing the pointer to a non-existent smallest number, the first call to next() will return the smallest element in the BST.

You may assume that next() calls will always be valid. That is, there will be at least a next number in the in-order traversal when next() is called.

Example 1:

Input
[“BSTIterator”, “next”, “next”, “hasNext”, “next”, “hasNext”, “next”, “hasNext”, “next”, “hasNext”]
[[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
Output
[null, 3, 7, true, 9, true, 15, true, 20, false]

Explanation

BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
bSTIterator.next(); // return 3
bSTIterator.next(); // return 7
bSTIterator.hasNext(); // return True
bSTIterator.next(); // return 9
bSTIterator.hasNext(); // return True
bSTIterator.next(); // return 15
bSTIterator.hasNext(); // return True
bSTIterator.next(); // return 20
bSTIterator.hasNext(); // return False

Constraints:

  • The number of nodes in the tree is in the range [1, 105].
  • 0 <= Node.val <= 106
  • At most 105 calls will be made to hasNext, and next.

In-Order 就是先左后自己最后右, 对于 BST 来说最后的输出结果就是从小到大, 说到这,首先想到的最简单的办法就是遍历整棵树然后收集成一个 BinaryHeap, 后面就是不停的 pop 就好了。但是既然是处理树的问题, 用递归的思想貌似看上去更地道一点。



use std::cell::RefCell;
use std::rc::Rc;

struct BSTIterator {
    root: Option<Rc<RefCell<TreeNode>>>,
}

fn next(root: Option<Rc<RefCell<TreeNode>>>) -> (i32, Option<Rc<RefCell<TreeNode>>>) {
    if let Some(node) = &root {
        let (left_val, left) = next(node.borrow_mut().left.take());
        node.borrow_mut().left = left;
        if left_val >= 0 {
            return (left_val, Some(node.clone()));
        }
        let right = node.borrow_mut().right.take();
        return (node.borrow().val, right);
    }
    (-1, None)
}

/**
 * `&self` means the method takes an immutable reference.
 * If you need a mutable reference, change it to `&mut self` instead.
 */
impl BSTIterator {
    fn new(root: Option<Rc<RefCell<TreeNode>>>) -> Self {
        Self { root }
    }

    fn next(&mut self) -> i32 {
        let (val, root) = next(self.root.take());
        self.root = root;
        val
    }

    fn has_next(&self) -> bool {
        self.root.is_some()
    }
}

### 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!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值