BSTIterator-二叉搜索树迭代器
发布日期:2021-05-18 07:53:24 浏览次数:20 分类:精选文章

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

BSTIterator是一种用于按中序遍历二叉搜索树(BST)的迭代器。该迭代器通过维护一个指针,逐步访问树中的节点,返回中序遍历的结果。以下是BSTIterator的实现思路和代码示例。

实现思路

  • 构造函数:在构造函数中执行一次中序遍历,将树中的所有节点的值按顺序存储在一个列表中。这样可以在后续的next()和hasNext()操作中快速访问这些值。
  • 指针维护:使用一个指针来跟踪当前访问的节点位置。初始时,指针位于一个不存在于树中的数字,确保第一次next()调用返回树中的最小值。
  • hasNext()操作:检查指针是否已经到达列表的末尾。如果指针位置小于等于列表的大小减一,则返回true,否则返回false。
  • next()操作:如果有下一个节点,返回当前指针位置的值,并将指针前进一位。
  • 这种方法确保了每次next()和hasNext()操作的时间复杂度为O(1),并且只需额外存储与树的高度成正比的空间。

    代码示例

    import java.util.ArrayList;
    import java.util.List;
    class BSTIterator {
    private List
    list;
    private int count = 0;
    private int size = 0;
    public BSTIterator(TreeNode root) {
    if (root == null) {
    size = 0;
    return;
    }
    List
    list = new ArrayList<>();
    this.list = list;
    this.size = 0;
    this.digui(root, list);
    this.size = list.size();
    }
    private void digui(TreeNode node, List
    list) {
    if (node == null) {
    return;
    }
    if (node.left != null) {
    digui(node.left, list);
    } else {
    list.add(node.val);
    }
    if (node.right != null) {
    digui(node.right, list);
    } else {
    list.add(node.val);
    }
    size = list.size();
    }
    public int next() {
    if (count <= size - 1) {
    return list.get(count++);
    } else {
    return null;
    }
    }
    public boolean hasNext() {
    return count <= size - 1;
    }
    }

    代码解释

  • 构造函数:BSTIterator的构造函数接受BST的根节点,并执行一次中序遍历,将所有节点的值存储在列表中。这里使用了递归的digui方法来填充列表。
  • digui方法:递归地访问树的左子节点,填充列表。访问完左子树后,填充当前节点的值,接着递归访问右子树。
  • next()方法:返回当前指针位置的值,并前进指针。如果指针超出列表范围,则返回null。
  • hasNext()方法:检查指针是否在列表范围内。如果有下一个节点,返回true,否则返回false。
  • 这种方法确保了迭代器能够按中序顺序访问BST中的节点,并且每次操作的时间复杂度为O(1),空间复杂度为O(h),其中h是树的高度。

    上一篇:leetcode周赛234-二,三题
    下一篇:rotateRight-旋转链表

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月25日 22时18分40秒