[Leetcode] Binary Search Tree Iterator 二叉搜素树迭代器

本文介绍了一种二叉搜索树(BST)迭代器的实现方法,该迭代器能在平均O(1)的时间复杂度内返回BST中的下一个最小值,并使用O(h)的空间复杂度,其中h为树的高度。通过栈来保存从根节点到当前节点的路径,确保了每次调用next()方法都能高效地获取下一个值。

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

Binary Search Tree Iterator

最新更新:https://yanjia.me/zh/2019/02/...

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.

Note: next() and hasNext() should run in average O(1) time and uses O(h) memory, where h is the height of the tree.

栈法

复杂度

时间 O(N) 空间 O(1)

思路

这道题和Inorder Successor in BST很像,区别在于Successor那题是给定节点求下一个,而这题是要做一个迭代器,返回当前指向的值,其实就是求上次返回的节点的下一个,本质是一样的。题目要求最多只能用O(H)的空间,所以思路也和那题一样,用一个Stack记录从根节点到当前节点的路径。next的时候就返回Stack最上面的元素。不过拿出最上面的元素后,我们还要看一下这个被返回的元素是否有右节点,如果有的话,就把它的右节点及右节点的所有左边节点都压入栈中。另外,初始化栈时,我们要找到最左边的节点,也就是中序遍历的第一个节点,并把根到第一个节点的路径都压入栈。

这题还可以结合Binary Tree Inorder Traverse的迭代做法一起理解。他们的共同点都是用一个栈,将最左边的节点都压入栈。

代码

public class BSTIterator {
    
    Stack<TreeNode> stk;

    public BSTIterator(TreeNode root) {
        stk = new Stack<TreeNode>();
        // 先找到第一个节点,并把路径入栈
        while(root != null){
            stk.push(root);
            root = root.left;
        }
    }

    public boolean hasNext() {
        // 栈为空时不再有下一个
        return !stk.isEmpty();
    }

    public int next() {
        // 栈顶是待返回元素
        TreeNode curr = stk.pop();
        int res = curr.val;
        // 如果该元素有右节点,把它的右节点及右节点的所有左边节点都压入栈中
        if(curr.right != null){
            curr = curr.right;
            while(curr != null){
                stk.push(curr);
                curr = curr.left;
            }
        }
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值