我正在做一个作业来改变一个类和方法,这样它就可以支持增强的for循环来遍历二叉树。图片已链接。提前谢谢你!
修改/完善BSTIterator.java类,使用setTraversalType方法使用增强的for循环以逻辑层级设置的遍历类型遍历树。您还需要对 BinarySearchTree.java 中的迭代器方法进行适当的更改。
您在第 2 部分的工作允许破坏 BinarySearchTree.java 中现有的 getNext 方法;即,您不需要同时拥有有效的 BSTIterator 类和有效的 getNext 方法。
BSTIterator.java:
public class BSTIterator <E> implements Iterator<E>, Iterable<E> {
protected LLQ<E> traversalQueue;
protected TraversalType traversalType;
protected E rootData;
protected int size;
protected int counter;
public BSTIterator(E rootData, int size) {
this.rootData = rootData;
this.size = size;
this.counter = 0;
}
@Override
public boolean hasNext() {
return counter < size;
//return !traversalQueue.isEmpty();
}
@Override
public E next() {
counter++;
return traversalQueue.dequeue();
}
@Override
public Iterator<E> iterator() {
return this;
}
public void setTraversalType(TraversalType traversalType, LLQ<E> traversalQueue) {
this.traversalType = traversalType;
this.traversalQueue = traversalQueue;
}
}
BinarySearchTree.java 声明:
public class BinarySearchTree<T> extends Comparable<T>> implements BSTInterface<T>, Iterable<T> {
protected TraversalType traversalType;
protected BSTNode<T> root;
boolean found; // used by remove
T[] rebalanceArray; // for rebalancing the tree
int rebalanceIndex; // "
// for current traversal logic
protected LLQ<T> inOrderQ;
protected LLQ<T> preOrderQ;
protected LLQ<T> postOrderQ;
迭代器方法:(该方法错误)
public Iterator<T> iterator() {
if (root == null) {
return new BSTIterator<>(null, 0);
}
else {
if (traversalType == TraversalType.INORDER) {
return new BSTIterator<>(root.getData(),size, inOrderQ);
} else if (traversalType == TraversalType.PREORDER) {
return new BSTIterator<>(root.getData(),size, preOrderQ);
} else if (traversalType == TraversalType.POSTORDER) {
return new BSTIterator<>(root.getData(),size, postOrderQ);
} else {
return new BSTIterator<>(null, 0);
}
}
}
setTraversalType 方法(不可更改):
public void setTraversalType(TraversalType orderType) {
switch (orderType) {
case INORDER:
inOrderQ = new LLQ<T>();
inOrder(root);
break;
case PREORDER:
preOrderQ = new LLQ<T>();
preOrder(root);
break;
case POSTORDER:
postOrderQ = new LLQ<T>();
postOrder(root);
break;
}
}
我的迭代器方法中的红线尺寸不足:
if (traversalType == TraversalType.INORDER) {
return new BSTIterator<>(root.getData(),size, inOrderQ);
} else if (traversalType == TraversalType.PREORDER) {
return new BSTIterator<>(root.getData(),size, preOrderQ);
} else if (traversalType == TraversalType.POSTORDER) {
return new BSTIterator<>(root.getData(),size, postOrderQ);
with error cannot infer type arguments for BSTIterator<>