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();
}
}
首先,考察构造函数。迭代器
应该是快速的,并且通常使用底层数据结构的实时副本。因此,我建议不要每次都创建一个新树。
public BSTIterator(BST<E, K> tree) {
this.currentNode = tree.getRoot();
}
现在,要在不使用递归的情况下遍历树结构,可以使用stack
。同时,跟踪当前访问的节点。
Stack<BSTNode<E>> stack = new Stack<>();
BSTNode<E> currentNode;
现在,使用next()
方法。若要开始,请确保在当前迭代器没有剩余元素的情况下抛出nosuchelementexception
。我们现在只需使用!hasnext()
。然后按照以下步骤操作:
CurrentNode
为Null
且Stack
不为空,POP()
为节点,则将CurrentNode
更新为正确的子节点并返回包含的节点数据。下次调用next()
时,遍历将在此位置继续。CurrentNode
为Null
且堆栈为空,则完成操作。这是next()
的实现:
@Override
public E next() {
if(!hasNext())
throw new NoSuchElementException();
while(!stack.empty() || currentNode != null) {
if(currentNode != null) {
stack.push(currentNode);
currentNode = currentNode.getLeft();
} else {
BSTNode<E> node = stack.pop();
currentNode = node.getRight();
return node.getData();
}
}
}
从这里开始,只剩下hasNext()
。这个方法现在也应该很清楚了,因为它可以通过反转next()
中的while
条件来实现。
@Override
public boolean hasNext() {
return stack.empty() && currentNode == null;
}
高级功能:
大多数Java集合跟踪修改计数,或简称modcount
。它存储一个集合被修改的次数。此数据可用于检测底层数据结构在迭代时何时被非法修改。只需将modcount
传递给迭代器
。当然,您必须在树中实现该特性,并在每次修改时增加该数字。
public BSTIterator(BST<E, K> tree) {
this.tree = tree;
this.currentNode = tree.getRoot();
this.expectedModCount = tree.modCount;
}
然后,实现fail-fast行为:
@Override
public E next() {
if(expectedModCount != tree.modCount)
throw new ConcurrentModificationException();
// ...
}
HLOJ 9576,习题7-2 二叉排序树 输入一个整数关键字序列,生成一棵用链式存储结构存储的二叉排序树,对该二叉排序树能进行查找和插入结点的操作,并对该二叉排序树中结点的关键字按递增和递减顺序输出。 要求依次完成以下工作: (1) 以这n个整数生成(建立)一棵用链式存储结构存储的二叉排序树; (2) 按递增顺序输出该二叉排序树中的整数(关键字); (3) 输入一个整数key1,对该二叉排序树进
我正在尝试为我一直在研究的BST结构实现一个移除方法。以下是包含查找、插入和删除方法的代码: 我被告知可以使用insert方法来帮助我使用remove方法,但我只是不知道如何获取最小/最大的元素,然后用该值替换我正在删除的元素,然后递归地删除我获取替换值的节点,同时仍然保持O(logn)的复杂性。有人有什么想法或明显的漏洞我错过了,或任何其他有帮助的,因为我撞我的头在这个问题上? 编辑:我用答案的
我正在制作一个按字符串键排序的二叉搜索树。每个节点由一个与一个键相关联的无序信息链表组成。这棵树是按字母顺序排列的。 我已经完成了大部分的程序,但有麻烦的删除方法。 谢谢你。
我很难按我教授想要的格式打印出一个二叉搜索树。 他的格式是这样的: 我的代码:
下面是将二叉查找树的前序遍历转换为原始树的代码。 下面的代码采用整数数组,表示二进制搜索树的预序遍历。返回构造树的根。 来源:http://www . geeks forgeeks . org/construct-BST-from-given-preorder-traversal-set-2/ 我无法理解此代码。有人能帮我理解以下内容吗 > 在任何给定的迭代中,堆栈中存储的值与指出的当前值相关 从