Preorder Iterator
class BSTIterator { Stack<TreeNode> s = new Stack<>(); public BSTIterator(TreeNode root) { if (root != null) s.push(root); } public int next() { TreeNode cur = s.pop(); if (cur.right != null) s.push(cur.right); if (cur.left != null) s.push(cur.left); return cur.val; } public boolean hasNext() { return (!s.isEmpty()); }}
Postorder Iterator
class BSTIterator { Stack<TreeNode> s = new Stack<>(); public BSTIterator(TreeNode root) { push(root); } public int next() { TreeNode cur = s.pop(); if (!s.isEmpty()) { TreeNode top = s.peek(); if (cur == top.left) push(top.right); } return cur.val; } public boolean hasNext() { return (!s.isEmpty()); } public void push(TreeNode node) { while (node != null) { s.push(node); if (node.left != null) node = node.left; else node = node.right; } }}
Inorder Iterator
class BSTIterator { Stack<TreeNode> s = new Stack<>(); public BSTIterator(TreeNode root) { push(root); } /** @return the next smallest number */ public int next() { TreeNode cur = s.pop(); push(cur.right); return cur.val; } /** @return whether we have a next smallest number */ public boolean hasNext() { return !s.isEmpty(); } public void push(TreeNode node) { while (node != null) { s.push(node); node = node.left; } }}