二叉搜索树迭代器

博客围绕二叉搜索树迭代器展开,介绍调用 next() 会返回二叉搜索树中下一个最小的数,且 next 和 hasNext() 操作时间复杂度为 O(1)。给出解决思路,先让所有左孩子入栈,在 next 方法中弹栈,有右子树则将其及左子树入栈,hasNext 判断栈是否为空。

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

二叉搜索树迭代器

什么是二叉搜索树迭代器

调用 next() 将返回二叉搜索树中的下一个最小的数。

如图:
在这里插入图片描述

这里我们next和hasNext()的操作的时间复杂度为O(1)

我解决这个问题的思路:

1.我们首先让所有的左孩子全部入栈

如图:7,3

2.然后我们在next方法里开始弹栈

如果该节点有右子树那么我们假设temp=node.right

然后让temp和temp的左子树全部入栈

最后返回node.value就可以了

如图:3弹栈 3没有右子树直接返回3

7弹栈 7有右子树让15,9入栈 9没有左子树 返回7

9出栈 9没有右子树 返回 9

15出栈 15有右子树 20入栈 20没有左子树 返回 15

最后20出栈 20没有右子树 返回 20

3.我们的hasNext很简单只要判断栈是否为空就可以了

上代码:

import java.util.Arrays;
class BSTIterator {
    // int[] array;
    // int index;
    Stack<TreeNode> stack=new Stack();
    public BSTIterator(TreeNode root) {
       //放在构造方法里为了保证O(1)的时间复杂度
        while(root!=null){
            stack.push(root);
            root=root.left;
        }
    }
    
    /** @return the next smallest number */
    //获取下一个最小的数
    public int next() {
        TreeNode node=stack.pop();//弹栈
        if(node.right!=null){//如果右子树不为空
            TreeNode temp=node.right;
            while(temp!=null){//将右子树和它的左子树的左孩子进栈
                stack.push(temp);
                temp=temp.left;
            }
            
        }
        return node.val;//返回弹栈元素
    }
    /** @return whether we have a next smallest number */
    //判断是否有下一个最小的数字
    public boolean hasNext() {
        if(stack.isEmpty()){//如果没有下一个元素返回false
            return false;
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值