Binary Search Tree Iterator
Question
- lintcode: (86) Binary Search Tree Iterator </i>
Design an iterator over a binary search tree with the following rules:
- Elements are visited in ascending order (i.e. an in-order traversal)
- next() and hasNext() queries run in O(1) time in average.
Example
For the following binary search tree, in-order traversal by using iterator is [1, 6, 10, 11, 12]
10
/ \
1 11
\ \
6 12
Challenge
Extra memory usage O(h), h is the height of the tree.
Super Star: Extra memory usage O(1)
题解 - 中序遍历
仍然考的是中序遍历,但是是非递归实现。其实这道题等价于写一个二叉树中序遍历的迭代器。需要内置一个栈,一开始先存储到最左叶子节点的路径。在遍历的过程中,只要当前节点存在右子树,则进入右子树,存储从此处开始到当前子树里最左叶子节点的路径。
"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
Example of iterate a tree:
iterator = BSTIterator(root)
while iterator.hasNext():
node = iterator.next()
do something for node
"""
class BSTIterator:
#@param root: The root of binary tree.
def __init__(self, root):
self.stack = []
self.curt = root
#@return: True if there has next node, or false
def hasNext(self):
return self.curt is not None or len(self.stack) > 0
#@return: return next node
def next(self):
while self.curt is not None:
self.stack.append(self.curt)
self.curt = self.curt.left
self.curt = self.stack.pop()
nxt = self.curt
self.curt = self.curt.right
return nxt
# Definition for a binary tree node
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class BSTIterator:
# @param root, a binary search tree's root node
def __init__(self, root):
self.tree = []
self.inOrderTraverse(root)
self.idx = -1
self.size = len(self.tree)
# @return a boolean, whether we have a next smallest number
def hasNext(self):
self.idx += 1
return self.idx < self.size
# @return an integer, the next smallest number
def next(self):
return self.tree[self.idx]
def inOrderTraverse(self, root):
if root is None:
return
self.inOrderTraverse(root.left)
self.tree.append(root.val)
self.inOrderTraverse(root.right)
# Your BSTIterator will be called like this:
# i, v = BSTIterator(root), []
# while i.hasNext(): v.append(i.next())