在 Java 中为二叉树编写通用迭代器
Writing a generic iterator in Java for Binary Tree
我想为二叉树编写自定义迭代器。这个迭代器应该 return Node<?>
个对象。我在递归调用 fillList 的行中在文件 InorderIterator
中遇到编译错误:fillList(currentNode.getLeft());
错误是:Error:(14, 37) java: incompatible types: rclib.Node cannot be converted to T
有人可以解释一下为什么我的方法不起作用吗?或者如何修复它
Node.java
package rclib;
public class Node<T extends Comparable<T>> {
T key;
Node<T> left;
Node<T> right;
public Node(T key, Node left, Node right) {
this.key = key;
this.left = left;
this.right = right;
}
public Node(T key) {
this(key, null, null);
}
public Node<T> getLeft() {
return left;
}
public Node<T> getRight() {
return right;
}
public T getKey() {
return key;
}
}
InorderIterator.java
package rclib;
import java.util.*;
public class InorderIterator<T extends Node<?>> implements Iterator<T> {
LinkedList<T> list;
public InorderIterator(T root) {
list = new LinkedList<T>();
fillList(root);
}
public void fillList(T currentNode) {
if (currentNode == null) return;
fillList(currentNode.getLeft());
list.add(currentNode);
fillList(currentNode.getRight());
}
@Override
public boolean hasNext() {
return !list.isEmpty();
}
@Override
public T next() {
return list.removeFirst();
}
}
AVLTree.java
package rclib;
public class AVLTree<T extends Comparable<T>> implements Iterable<Node<T>>{
private Node<T> root;
@Override
public Iterator<Node<T>> iterator() {
return new InorderIterator<Node<T>>(root);
}
}
你也许应该这样做:
package rclib;
import java.util.*;
public class InorderIterator<T extends Comparable<T>> implements Iterator<Node<T>> {
LinkedList<Node<T>> list;
public InorderIterator(Node<T> root) {
list = new LinkedList<Node<T>>();
fillList(root);
}
public void fillList(Node<T> currentNode) {
if (currentNode == null) return;
fillList(currentNode.getLeft());
list.add(currentNode);
fillList(currentNode.getRight());
}
@Override
public boolean hasNext() {
return !list.isEmpty();
}
@Override
public Node<T> next() {
return list.removeFirst();
}
}
您必须明确指定您使用的是 Node
而不是 ? extends Node
,这最终可能不符合正确的用法。
public static class InorderIterator<T extends Comparable<T>> implements Iterator<Node<T>> {
LinkedList<Node<T>> list;
public InorderIterator(Node<T> root) {
list = new LinkedList<>();
fillList(root);
}
public void fillList(Node<T> currentNode) {
if (currentNode == null) return;
fillList(currentNode.getLeft());
list.add(currentNode);
fillList(currentNode.getRight());
}
@Override
public boolean hasNext() {
return !list.isEmpty();
}
@Override
public Node<T> next() {
return list.removeFirst();
}
}
我想为二叉树编写自定义迭代器。这个迭代器应该 return Node<?>
个对象。我在递归调用 fillList 的行中在文件 InorderIterator
中遇到编译错误:fillList(currentNode.getLeft());
错误是:Error:(14, 37) java: incompatible types: rclib.Node cannot be converted to T
有人可以解释一下为什么我的方法不起作用吗?或者如何修复它
Node.java
package rclib;
public class Node<T extends Comparable<T>> {
T key;
Node<T> left;
Node<T> right;
public Node(T key, Node left, Node right) {
this.key = key;
this.left = left;
this.right = right;
}
public Node(T key) {
this(key, null, null);
}
public Node<T> getLeft() {
return left;
}
public Node<T> getRight() {
return right;
}
public T getKey() {
return key;
}
}
InorderIterator.java
package rclib;
import java.util.*;
public class InorderIterator<T extends Node<?>> implements Iterator<T> {
LinkedList<T> list;
public InorderIterator(T root) {
list = new LinkedList<T>();
fillList(root);
}
public void fillList(T currentNode) {
if (currentNode == null) return;
fillList(currentNode.getLeft());
list.add(currentNode);
fillList(currentNode.getRight());
}
@Override
public boolean hasNext() {
return !list.isEmpty();
}
@Override
public T next() {
return list.removeFirst();
}
}
AVLTree.java
package rclib;
public class AVLTree<T extends Comparable<T>> implements Iterable<Node<T>>{
private Node<T> root;
@Override
public Iterator<Node<T>> iterator() {
return new InorderIterator<Node<T>>(root);
}
}
你也许应该这样做:
package rclib;
import java.util.*;
public class InorderIterator<T extends Comparable<T>> implements Iterator<Node<T>> {
LinkedList<Node<T>> list;
public InorderIterator(Node<T> root) {
list = new LinkedList<Node<T>>();
fillList(root);
}
public void fillList(Node<T> currentNode) {
if (currentNode == null) return;
fillList(currentNode.getLeft());
list.add(currentNode);
fillList(currentNode.getRight());
}
@Override
public boolean hasNext() {
return !list.isEmpty();
}
@Override
public Node<T> next() {
return list.removeFirst();
}
}
您必须明确指定您使用的是 Node
而不是 ? extends Node
,这最终可能不符合正确的用法。
public static class InorderIterator<T extends Comparable<T>> implements Iterator<Node<T>> {
LinkedList<Node<T>> list;
public InorderIterator(Node<T> root) {
list = new LinkedList<>();
fillList(root);
}
public void fillList(Node<T> currentNode) {
if (currentNode == null) return;
fillList(currentNode.getLeft());
list.add(currentNode);
fillList(currentNode.getRight());
}
@Override
public boolean hasNext() {
return !list.isEmpty();
}
@Override
public Node<T> next() {
return list.removeFirst();
}
}