Implement the BSTIterator class that represents an iterator over the in-order traversal of a binary search tree (BST):
BSTIterator(TreeNode root) - Initializes an object of the BSTIterator class. The root of the BST is given as part of the constructor. The pointer should be initialized to a non-existent number smaller than any element in the BST.
boolean hasNext() - Returns true if there exists a number in the traversal to the right of the pointer, otherwise returns false.
int next() - Moves the pointer to the right, then returns the number at the pointer.
boolean hasPrev() - Returns true if there exists a number in the traversal to the left of the pointer, otherwise returns false.
int prev() - Moves the pointer to the left, then returns the number at the pointer.
Notice: By initializing the pointer to a non-existent smallest number, the first call to next() will return the smallest element in the BST. You may assume that next() and prev() calls will always be valid.
Input & Output
Constraints
- The number of nodes in the tree is in the range [1, 105]
- 0 ≤ Node.val ≤ 106
- At most 105 calls will be made to hasNext, next, hasPrev, and prev