Binary Search Tree Iterator
Problem
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.
Solution
public class BSTIterator {
Stack<TreeNode> stack = new Stack<>();
public BSTIterator(TreeNode root) {
pushAllLeft(root);
}
/** @return whether we have a next smallest number */
public boolean hasNext() {
return !stack.isEmpty();
}
/** @return the next smallest number */
public int next() {
TreeNode node = stack.pop();
pushAllLeft(node.right);
return node.val;
}
private void pushAllLeft(TreeNode node) {
while (node != null) {
stack.push(node);
node = node.left;
}
}
}
Analysis
We know that in BST, left is always smaller than other nodes
Hence, in constructor, we push all and only left nodes into stack
Then in next()
method, we push all left of node.right
This is because, current node
is popped out, the next smaller node is node.right
then are left nodes of node.right