LeetCode 173. Binary Search Tree Iterator(二叉搜索树迭代器)

题目

在这里插入图片描述
代码框架

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class BSTIterator {
    public BSTIterator(TreeNode root) {        
    }    
    public int next() {      
    }
    public boolean hasNext() {
    }  
}
/**
 * Your BSTIterator object will be instantiated and called as such:
 * BSTIterator obj = new BSTIterator(root);
 * int param_1 = obj.next();
 * boolean param_2 = obj.hasNext();
 */

求解

思路:这题类似于让我们用一个集合类来实现一个迭代器,且输入的数据是一棵二叉树(根节点)。题目中的提示中说:hasNext()和next()的时间复杂度是O(1),且使用O(h)内存,这不就正好可以使用一个栈来实现吗?使用深度为h的栈就可以存储所有的信息了,并且栈的弹栈操作时间复杂度是O(1),满足题目要求。我们需要用一个栈来实现迭代器。每次都要取出最小的一个值,且不能重复,可以通过得到最左侧的节点来实现。
栈操作:输入一个根节点,通过根节点把树的左侧所有节点存入栈,这些存入栈的节点对应的值小于其右子树的所有节点,且右子树的所有节点的值都小于下一个堆栈元素。取出的左侧一排可以类似于对于全部有序结果的一种抽样。当调用了next时,弹出栈顶元素,若它没有右子树,那么直接返回它就可以了;若它有右子树,那么不仅需要返回这个值,还需要把它的右子节点以及右子节点的所有左子节点压栈。后续操作就一样了。
完整代码

class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x) { val = x; }
  }
class BSTIterator {
	Stack<TreeNode> integers=new Stack<>();	
    public BSTIterator(TreeNode root) {
         TreeNode treeNode=root;;
         while(treeNode!=null){
        	 integers.push(treeNode);
        	 treeNode=treeNode.left;
         }
    }
    public int next() {
        TreeNode treeNode=integers.pop();
        TreeNode treeRight=treeNode.right;
        while(treeRight!=null){
        	integers.push(treeRight);
        	treeRight=treeRight.left;
        }
        return treeNode.val;
    }
    public boolean hasNext() {
        return !integers.isEmpty();
    }    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值