
BSTIterator-二叉搜索树迭代器
构造函数:在构造函数中执行一次中序遍历,将树中的所有节点的值按顺序存储在一个列表中。这样可以在后续的next()和hasNext()操作中快速访问这些值。 指针维护:使用一个指针来跟踪当前访问的节点位置。初始时,指针位于一个不存在于树中的数字,确保第一次next()调用返回树中的最小值。 hasNext()操作:检查指针是否已经到达列表的末尾。如果指针位置小于等于列表的大小减一,则返回true,否则返回false。 next()操作:如果有下一个节点,返回当前指针位置的值,并将指针前进一位。 构造函数:BSTIterator的构造函数接受BST的根节点,并执行一次中序遍历,将所有节点的值存储在列表中。这里使用了递归的digui方法来填充列表。 digui方法:递归地访问树的左子节点,填充列表。访问完左子树后,填充当前节点的值,接着递归访问右子树。 next()方法:返回当前指针位置的值,并前进指针。如果指针超出列表范围,则返回null。 hasNext()方法:检查指针是否在列表范围内。如果有下一个节点,返回true,否则返回false。
发布日期:2021-05-18 07:53:24
浏览次数:20
分类:精选文章
本文共 1807 字,大约阅读时间需要 6 分钟。
BSTIterator是一种用于按中序遍历二叉搜索树(BST)的迭代器。该迭代器通过维护一个指针,逐步访问树中的节点,返回中序遍历的结果。以下是BSTIterator的实现思路和代码示例。
实现思路
这种方法确保了每次next()和hasNext()操作的时间复杂度为O(1),并且只需额外存储与树的高度成正比的空间。
代码示例
import java.util.ArrayList;import java.util.List;class BSTIterator { private Listlist; 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; }}
代码解释
这种方法确保了迭代器能够按中序顺序访问BST中的节点,并且每次操作的时间复杂度为O(1),空间复杂度为O(h),其中h是树的高度。