我正在构建一个二叉搜索树类,它有一个有序迭代器和一个预有序迭代器。我已经为顺序迭代器编写了一个尝试,但是我认为我没有正确的代码。我阅读了一些关于迭代器编码的指南,我接受了我解释的内容,并尝试在我的设计中实现它。下一个还树的人是可疑的。当前tree.isempty()返回树的根节点是否为空。我不确定在树的迭代过程中检查是否正确。
我不完全相信我对有序迭代工作原理的理解。目前,我从root.left开始使用next()方法,而不是从那里尝试迭代。
代码澄清的一些注解e=节点的元素/数据k=键
public class BSTIterator<E, K> implements StructureIterator<E> {
private final BST<E, K> tree;
BSTNode<E> root =null;
// Comparator<E> sortFct;
// BiFunction<K, E, Integer> searchFct;
public BSTIterator( BSTNode<E> root,Comparator<E> sortFct,
BiFunction<K, E, Integer> searchFct) {
this.tree = new BST<E, K>(sortFct, searchFct);
this.root = root;
}
@Override
public E next() {
BSTNode<E> node = tree.root.getLeft();
E result = node.getData();
if(node.getRight() != null){
while(node != null){
tree.root.getRight();
node = node.getLeft();
}
}
return result;
}
@Override
public boolean hasNext() {
return !tree.isEmpty();
}
}
1条答案
按热度按时间d7v8vwbk1#
首先,检查施工人员。
Iterators
应该是快速的,并且通常使用底层数据结构的实时副本。因此,我建议不要每次都创建新树。现在,要在不使用递归的情况下遍历树结构,可以使用
Stack
. 此外,还要跟踪当前访问的节点。现在
next()
方法。首先,一定要抛出一个NoSuchElementException
如果没有更多元素留给当前迭代器。我们将使用!hasNext()
现在。然后按照以下步骤操作:将节点推送到堆栈中,直到当前节点没有剩余子节点。
如果
currentNode
是null
以及Stack
不是空的,pop()
节点,更新currentNode
并返回包含的节点数据。下次你打电话的时候next()
,遍历将在此位置继续。如果
currentNode
是null
如果栈是空的,你就完了。这是执行
next()
:从现在开始,只有
hasNext()
剩下的。这个方法现在也应该很清楚了,因为它可以通过反转while
条件next()
.高级功能:
大多数java集合都会跟踪修改计数或短时间,
modCount
. 它存储集合被修改的次数。此数据可用于检测在对基础数据结构进行迭代时是否非法修改了它。只需传递modCount
到Iterator
. 当然,您必须在树中实现该特性,并在每次修改时递增该数字。然后,实施fail fast行为: