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) 来获得相关源码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值