LeetCode Binary Search Tree Iterator
Posted gavinfish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Binary Search Tree Iterator相关的知识,希望对你有一定的参考价值。
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) 来获得相关源码。
以上是关于LeetCode Binary Search Tree Iterator的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Closest Binary Search Tree Value
[Lintcode]95. Validate Binary Search Tree/[Leetcode]98. Validate Binary Search Tree
[LeetCode] 173. Binary Search Tree Iterator_Medium_tag: Binary Search Tree