Binary Search Tree Iterator(lintcode 86)
Description
Design an iterator over a binary search tree with the following rules:
- Elements are visited in ascending order (i.e. an in-order traversal)
- next() and hasNext() queries run in O(1) time in average.
Example
For the following binary search tree, in-order traversal by using iterator is [1, 6, 10, 11, 12]
10
/ \
1 11
\ \
6 12
Interface
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
* Example of iterate a tree:
* BSTIterator iterator = new BSTIterator(root);
* while (iterator.hasNext()) {
* TreeNode node = iterator.next();
* do something for node
* }
*/
public class BSTIterator {
//@param root: The root of binary tree.
public BSTIterator(TreeNode root) {
// write your code here
}
//@return: True if there has next node, or false
public boolean hasNext() {
// write your code here
}
//@return: return next node
public TreeNode next() {
// write your code here
}
}
Solution
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
* Example of iterate a tree:
* BSTIterator iterator = new BSTIterator(root);
* while (iterator.hasNext()) {
* TreeNode node = iterator.next();
* do something for node
* }
*/
public class BSTIterator {
//@param root: The root of binary tree.
private Stack<TreeNode> stack = new Stack<>();
private TreeNode curr;
public BSTIterator(TreeNode root) {
// write your code here
curr = root;
}
//@return: True if there has next node, or false
public boolean hasNext() {
// write your code here
return !(curr == null && stack.isEmpty());
}
//@return: return next node
public TreeNode next() {
// write your code here
while (curr != null) {
stack.push(curr);
curr = curr.left;
}
curr = stack.pop();
TreeNode result = curr;
curr = curr.right;
return result;
}
}