实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。node
调用 next()
将返回二叉搜索树中的下一个最小的数。web
next()
和 hasNext()
操做的时间复杂度是 O(1),并使用 O(h) 内存,其中 h 是树的高度。app
你能够假设 next()
调用老是有效的,也就是说,当调用 next()
时,BST 中至少存在一个下一个最小的数。ide
因为题目要求使用O(h)的内存,也就是说再也不容许将全部的结点都存储下来再去取,所以那些利用中序遍历将全部结点存储下来的方法都不符合题目的要求,这道题目应该是只存储一部分的结点(好比只存左子结点或者只存右子结点);spa
stack只保存左孩子,当最左的孩子出列时,若是它有右孩子,就把它右孩子以及往下的全部左节点压入栈;code
class BSTIterator(object):
def __init__(self, root):
"""
:type root: TreeNode
"""
self.stack = []
self.__find_left_nodes(root)
def __find_left_nodes(self, node):
while node:
self.stack.append(node)
node = node.left
def next(self):
"""
@return the next smallest number
:rtype: int
"""
node = self.stack.pop()
self.__find_left_nodes(node.right)
return node.val
def hasNext(self):
"""
@return whether we have a next smallest number
:rtype: bool
"""
return bool(self.stack)