博客
关于我
leetcode题解173-二叉搜索树迭代器
阅读量:791 次
发布时间:2023-01-31

本文共 1391 字,大约阅读时间需要 4 分钟。

二叉搜索树迭代器实现

问题描述

为了实现一个能够返回二叉搜索树下一个最小数的迭代器,我们可以采用中序遍历的方法。这意味着在构造迭代器时,我们首先遍历树记录下所有节点的值。然后,通过一个指针跟踪当前位置,每次调用 next() 方法时,指针后移并返回对应的值。hasNext() 方法则检查指针是否仍有未访问的元素。

解题思路

  • 中序遍历预处理:首先,我们对二叉搜索树进行一次中序遍历,将所有节点的值按顺序存储到一个列表中。这一步的时间复杂度为 O(n),空间为 O(n)。
  • 指针初始化:使用一个指针记录当前遍历位置,初始值为 -1,表示尚未访问任何元素。
  • 下一个元素访问next() 方法将指针后移一位,并返回该位置的值。若指针超出列表范围,说明无更多元素可访问。
  • 检查是否有后续元素hasNext() 方法判断指针后一位是否仍在列表范围内,防止越界访问。
  • 这种方法确保了每次 next()hasNext() 的操作时间复杂度为 O(1),空间复杂度为 O(h),其中 h 为树的高度。

    代码实现

    class BSTIterator:    def __init__(self, root):        self.list = []        self.pointer = -1        # Perform in-order traversal to collect all node values        self.mid_order(root)        def mid_order(self, node):        if node is not None:            # Traverse left subtree            if node.left:                self.mid_order(node.left)            # Visit current node            self.list.append(node.value)            # Traverse right subtree            if node.right:                self.mid_order(node.right)        def next(self):        self.pointer += 1        return self.list[self.pointer]        def hasNext(self):        return self.pointer + 1 < len(self.list)

    解释:

    • mid_order 方法进行递归的中序遍历,将节点值存入 self.list
    • 构造函数 __init__ 初始化迭代器,调用 mid_order 开始收集值。
    • next() 方法将 pointer 前进并返回对应的值。
    • hasNext() 检查是否还有未访问的元素返回布尔值。

    优点:

    • 高效性:每次操作时间复杂度为 O(1),空间复杂度为 O(h)。
    • 简洁明了:代码结构简洁,易于理解和维护。
    • 预处理只需一次遍历:减少了每次查找的开销。

    这种方法适用于需要频繁访问树节点的场景,能够显著提升性能。

    转载地址:http://ohgyk.baihongyu.com/

    你可能感兴趣的文章
    LeetCode数据库题目汇总一(附答案)
    查看>>
    LeetCode数据库题目汇总二(附答案)
    查看>>
    LeetCode新手指南:从零开始掌握算法挑战
    查看>>
    LeetCode智加科技专场——第207场周赛题解
    查看>>
    leetcode正则表达式匹配
    查看>>
    leetcode第40题:组合总和II
    查看>>
    leetcode算法题解(Java版)-6-链表,字符串
    查看>>
    LeetCode经典——202.快慢指针之快乐数
    查看>>
    LeetCode经典——70.爬楼梯&&509.斐波拉契数列
    查看>>
    Leetcode经典系列——LRU最近最少使用机制
    查看>>
    LeetCode美团专场——第203场周赛题解
    查看>>
    LeetCode蔚来专场——第208场周赛题解
    查看>>
    leetcode题解-买卖股票的最佳时机
    查看>>
    leetcode题解102-二叉树的层序遍历
    查看>>
    leetcode题解102-翻转二叉树
    查看>>
    leetcode题解104- 二叉树的最大深度
    查看>>
    leetcode题解108-将有序数组转换为二叉排序树
    查看>>
    leetcode题解118-杨辉三角
    查看>>
    leetcode题解131-分割回文串
    查看>>
    leetcode题解136-只出现一次的数字
    查看>>