博客
关于我
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/

    你可能感兴趣的文章
    libiconv字符集转换库在C#中的使用
    查看>>
    liblognorm编译
    查看>>
    libmpg123 解码库用法
    查看>>
    Library Module上传Jcenter详解
    查看>>
    LibreOffice 24.8.1 办公套件正式发布,修复了 89 个错误
    查看>>
    LibreOffice放映Slides时粗体字模糊的解决方案
    查看>>
    LibreOJ #6000. 「网络流 24 题」搭配飞行员
    查看>>
    LibreOJ 6277 数列分块入门 1(分块)
    查看>>
    Librosa基音跟踪-STFT
    查看>>
    libssh2编译部署详解
    查看>>
    libthriftnb.so: undefined reference to `evutil_make_socket_closeonexec'
    查看>>
    LibTorch与MFC
    查看>>
    libtorch中python中cuda可以使用,但是是c++环境中不行
    查看>>
    LibTorch中TensorOptions的使用
    查看>>
    LibTorch之DataSet数据集处理方法
    查看>>
    LibTorch之优化器
    查看>>
    LibTorch之全连接层(torch::nn::Linear)使用
    查看>>
    LibTorch之图像分类
    查看>>
    LibTorch之张量操作与线性回归
    查看>>
    LibTorch之损失函数
    查看>>