mplement 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.
Example:
BSTIterator iterator = new BSTIterator(root); iterator.next(); // return 3 iterator.next(); // return 7 iterator.hasNext(); // return true iterator.next(); // return 9 iterator.hasNext(); // return true iterator.next(); // return 15 iterator.hasNext(); // return true iterator.next(); // return 20 iterator.hasNext(); // return false
Note:
next()andhasNext()should run in average O(1) time and uses O(h) memory, where h is the height of the tree.- You may assume that
next()call will always be valid, that is, there will be at least a next smallest number in the BST whennext()is called.
因为是Binary Search Tree, 所以要用inorder travesal,所以可以在初始化的时候将tree 转变为stack,并且用一个指针来指向现在的node所在的位置,如果超过stack,那么就没有next。
T: O(n), S: O(n)
Code:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class BSTIterator(object):
def inOrder(self, root):
if not root: return
self.inOrder(root.left)
self.stack.append(root.val)
self.inOrder(root.right)
def __init__(self, root):
"""
:type root: TreeNode
"""
self.stack = []
self.point = 0
self.inOrder(root)
def next(self):
"""
@return the next smallest number
:rtype: int
"""
if self.hasNext():
nextNum = self.stack[self.point]
self.point += 1
return nextNum
def hasNext(self):
"""
@return whether we have a next smallest number
:rtype: bool
"""
if not self.stack or self.point >= len(self.stack):
return False
return True
# Your BSTIterator object will be instantiated and called as such:
# obj = BSTIterator(root)
# param_1 = obj.next()
# param_2 = obj.hasNext()