實現一個二叉搜索樹迭代器。你將使用二叉搜索樹的根節點初始化迭代器。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)