题目描述:实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。调用 next()
将返回二叉搜索树中的下一个最小的数。
示例:
BSTIterator iterator = new BSTIterator(root); iterator.next(); // 返回 3 iterator.next(); // 返回 7 iterator.hasNext(); // 返回 true iterator.next(); // 返回 9 iterator.hasNext(); // 返回 true iterator.next(); // 返回 15 iterator.hasNext(); // 返回 true iterator.next(); // 返回 20 iterator.hasNext(); // 返回 false提示:
next()
和hasNext()
操作的时间复杂度是 O(1),并使用 O(h) 内存,其中 h 是树的高度。- 你可以假设
next()
调用总是有效的,也就是说,当调用next()
时,BST 中至少存在一个下一个最小的数。
解法1。初始化一个栈存储从根节点一路向下的左子节点,next返回的就是stack的栈顶元素,然后把右子树(有的话)的一路向下的左子节点入栈
class BSTIterator(object):
def __init__(self, root):
self.stack = []
while root:
self.stack.append(root)
root = root.left
def next(self):
node = self.stack.pop()
res = node.val
if node.right:
node = node.right
while node:
self.stack.append(node)
node = node.left
return res
def hasNext(self):
return True if self.stack else False
解法2。也可以先中序遍历完存到栈中,然后在初始化函数中逆序,之后next输出栈顶元素
class BSTIterator(object):
def __init__(self, root):
"""
:type root: TreeNode
"""
self.stack = []
self.tinOrder(root)
self.stack.reverse()
def next(self):
"""
@return the next smallest number
:rtype: int
"""
return self.stack.pop() if self.stack else None
def hasNext(self):
"""
@return whether we have a next smallest number
:rtype: bool
"""
return True if self.stack else False
def tinOrder(self, root):
if not root:
return
self.tinOrder(root.left)
self.stack.append(root.val)
self.tinOrder(root.right)