题目描述
题目分析
方法一:递归
在__init()__中计算好(递归)中序遍历的序列,存入数组(空间复杂度O(n)),next()只需要遍历数组
构造数组时间复杂度O(n),空间复杂度O(n);查询数组O(1)
其中,n为树结点个数
方法二:非递归
根据非递归中序遍历模板,维护一个堆栈(空间复杂度O(h)),next()边输出下一个值(出栈)、边存储(入栈)
时间复杂度O(1),空间复杂度O(h)
其中,h为树的高度
python实现
class BSTIterator:
'''
# 递归实现——提前算好存入队列
def __init__(self, root: TreeNode):
self.queue = collections.deque()
self.InOrder(root)
def InOrder(self, root: TreeNode):
if root:
self.InOrder(root.left)
self.queue.append(root.val)
self.InOrder(root.right)
def next(self) -> int:
return self.queue.popleft()
def hasNext(self) -> bool:
return len(self.queue) != 0
'''
'''
# 非递归实现——堆栈模拟中序遍历(非递归)
'''
def __init__(self, root: TreeNode):
self.stack = collections.deque()
self.root = root
while self.root:
self.stack.append(self.root)
self.root = self.root.left
def next(self) -> int:
p = self.stack.pop()
ans = p.val
if p.right:
p = p.right
while p:
self.stack.append(p)
p = p.left
return ans
def hasNext(self) -> bool:
return len(self.stack)!=0