您的位置:首页 > 编程语言 > Python开发

LeetCode Binary Search Tree Iterator

2016-06-14 21:44 471 查看

LeetCode解题之Binary Search Tree Iterator

原题

在一棵二叉搜索树上实现一个迭代器,初始化参数为该二叉搜索树的根节点。当调用迭代器的
next()
方法时,返回该二叉搜索树中最小的元素。

注意点:

next()
hasNext()
操作的平均时间复杂度为O(1),空间复杂度为O(n),n是二叉树的高度

例子:



解题思路

要找到二叉搜索树中的最小节点,应该从根节点递归遍历左节点,直到遍历的节点没有左节点,那么该节点就是二叉树中的最小节点。现在已经有二叉搜索树中没有访问过的最小节点了,那么当访问了该节点后,剩余没有访问的树中最小的节点在哪里呢?如果该节点有右子树,那么在它的右子树中(又回到了找一棵二叉搜索树的最小元素,不过这棵二叉搜索树变小了);如果没有右子树,那么就是它的父节点。为了能够快速定位到父节点,我们可以用栈将遍历路径暂存起来,当进行
next()
操作时,我们弹出栈顶元素并进行访问,如果它有右子树的话就遍历它的右子树;如果没有右子树,当下次出栈操作时就是访问当前节点的父节点了。

hasNext()和next()要连用,如i.hasNext(): v.append(i.next()),否则会抛出出栈异常,测试用例提供了这项保证

AC源码

# Definition for a  binary tree node
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class BSTIterator(object):
def __init__(self, root):
"""
:type root: TreeNode
"""
self.stack = []
self._pushLeft(root)

def hasNext(self):
"""
:rtype: bool
"""
return self.stack

def next(self):
"""
:rtype: int
"""
node = self.stack.pop()
self._pushLeft(node.right)
return node.val

def _pushLeft(self, node):
while node:
self.stack.append(node)
node = node.left

# Your BSTIterator will be called like this:
# i, v = BSTIterator(root), []
# while i.hasNext(): v.append(i.next())

if __name__ == "__main__":
None


欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息