173. Binary Search Tree Iterator

60 篇文章 1 订阅

问题

实现一个顺序访问有序二叉树的迭代器。

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.

Example:

BSTIterator iterator = new BSTIterator(root);
iterator.next(); // return 3
iterator.next(); // return 7
iterator.hasNext(); // return true
iterator.next(); // return 9
iterator.hasNext(); // return true
iterator.next(); // return 15
iterator.hasNext(); // return true
iterator.next(); // return 20
iterator.hasNext(); // return false

Note:

next() and hasNext() should run in average O(1) time and uses O(h) memory, where h is the height of the tree.
You may assume that next() call will always be valid, that is, there will be at least a next smallest number in the BST when next() is called.

代码
Compare this typical iterative inorder traversal

  TreeNode visit = root;
  Stack<TreeNode> stack = new Stack();
  while (visit != null || !stack.empty()) {
     while (visit != null) {
          stack.push(visit);
          visit = visit.left;
      }
      TreeNode next = stack.pop();
      visit = next.right;
      doSomethingWith(next.val);
  }

with what we’re supposed to support here:

  BSTIterator i = new BSTIterator(root);
  while (i.hasNext())
      doSomethingWith(i.next());

You can see they already have the exact same structure:

Some initialization.
A while-loop with a condition that tells whether there is more.
The loop body gets the next value and does something with it.
So simply put the three parts of that iterative solution into our three iterator methods:

public class BSTIterator {

    private TreeNode visit;
    // 空间复杂度是O(h)
    private Stack<TreeNode> stack;
    
    public BSTIterator(TreeNode root) {
        visit = root;
        stack = new Stack();
    }
   //时间复杂度是O(1)
    public boolean hasNext() {
        return visit != null || !stack.empty();
    }
    //时间复杂度是O(h)
    public int next() {
        while (visit != null) {
            stack.push(visit);
            visit = visit.left;
        }
        TreeNode next = stack.pop();
        visit = next.right;
        return next.val;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值