[LeetCode] 173. Binary Search Tree Iterator
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.
Thought process:
The idea is to design a class that implements the iterative version of in-order traversal, like in "94. Binary Tree Inorder Traversal".
I will create a stack as an instance variable. In the constructor, I will push the root and its left branch onto the stack (go down root.left until bottom). hasNext() method can return whether the stack is empty. next() will pop a node off the stack, push the left branch of its right child onto stack if it has one, and return the node's value.
Solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class BSTIterator { private Stack<TreeNode> stack; public BSTIterator(TreeNode root) { stack = new Stack<>(); pushLeftPath(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(); pushLeftPath(node.right); return node.val; } private void pushLeftPath(TreeNode node) { while (node != null) { stack.push(node); node = node.left; } } } /** * Your BSTIterator will be called like this: * BSTIterator i = new BSTIterator(root); * while (i.hasNext()) v[f()] = i.next(); */ |
Time complexity: amortized O(1) for both next() and hasNext().
Comments
Post a Comment