用Java编写二叉树的泛型迭代器

用Java编写二叉树的泛型迭代器,java,generics,iterator,iterable,Java,Generics,Iterator,Iterable,我想为BinaryTree编写一个自定义迭代器。此迭代器应返回节点对象。在递归调用fillList的行中,我在Orderiterator的文件中得到编译错误:fillList(currentNode.getLeft()) 错误是:error:(14,37)java:不兼容的类型:rclib.Node无法转换为T 有人能解释一下为什么我的方法不起作用吗?或者如何修复它 Node.java 包rclib; 公共类节点{ T键; 左淋巴结; 节点权; 公共节点(T键、左节点、右节点){ this.ke

我想为BinaryTree编写一个自定义迭代器。此迭代器应返回
节点
对象。在递归调用fillList的行中,我在Orderiterator的文件
中得到编译错误:
fillList(currentNode.getLeft())

错误是:
error:(14,37)java:不兼容的类型:rclib.Node无法转换为T

有人能解释一下为什么我的方法不起作用吗?或者如何修复它

Node.java

包rclib;
公共类节点{
T键;
左淋巴结;
节点权;
公共节点(T键、左节点、右节点){
this.key=key;
this.left=左;
这个。右=右;
}
公共节点(T密钥){
这个(键,空,空);
}
公共节点getLeft(){
左转;
}
公共节点getRight(){
返还权;
}
公共T getKey(){
返回键;
}
}
inordereditor.java

包rclib;
导入java.util.*;

在Orderiterator中的public类您也许应该这样做:

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();
    }
}
包rclib;
导入java.util.*;
公共类InorderIterator实现迭代器{
链接列表;
公共索引编者(节点根){
列表=新的LinkedList();
填充列表(根);
}
公共无效填充列表(节点currentNode){
if(currentNode==null)返回;
fillList(currentNode.getLeft());
list.add(当前节点);
fillList(currentNode.getRight());
}
@凌驾
公共布尔hasNext(){
return!list.isEmpty();
}
@凌驾
公共节点下一步(){
return list.removeFirst();
}
}

您或许应该这样做:

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();
    }
}
包rclib;
导入java.util.*;
公共类InorderIterator实现迭代器{
链接列表;
公共索引编者(节点根){
列表=新的LinkedList();
填充列表(根);
}
公共无效填充列表(节点currentNode){
if(currentNode==null)返回;
fillList(currentNode.getLeft());
list.add(当前节点);
fillList(currentNode.getRight());
}
@凌驾
公共布尔hasNext(){
return!list.isEmpty();
}
@凌驾
公共节点下一步(){
return list.removeFirst();
}
}

您必须明确指定使用
节点而不是
?扩展节点
,该节点可能最终不适合正确使用

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();
    }
}
公共静态类InOrderWriter实现迭代器{
链接列表;
公共索引编者(节点根){
列表=新的LinkedList();
填充列表(根);
}
公共无效填充列表(节点currentNode){
if(currentNode==null)返回;
fillList(currentNode.getLeft());
list.add(当前节点);
fillList(currentNode.getRight());
}
@凌驾
公共布尔hasNext(){
return!list.isEmpty();
}
@凌驾
公共节点下一步(){
return list.removeFirst();
}
}

您必须明确指定使用
节点而不是
?扩展节点
,该节点可能最终不适合正确使用

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();
    }
}
公共静态类InOrderWriter实现迭代器{
链接列表;
公共索引编者(节点根){
列表=新的LinkedList();
填充列表(根);
}
公共无效填充列表(节点currentNode){
if(currentNode==null)返回;
fillList(currentNode.getLeft());
list.add(当前节点);
fillList(currentNode.getRight());
}
@凌驾
公共布尔hasNext(){
return!list.isEmpty();
}
@凌驾
公共节点下一步(){
return list.removeFirst();
}
}

旁白:
公共节点(T键,左节点,右节点){
应该是
公共节点(T键,左节点,右节点){
。你真的想要节点上的迭代器还是值上的迭代器?我想要节点上的迭代器旁白:
公共节点(T键,左节点,右节点){
应该是
公共节点(T键,左节点,右节点){
。您真的想要节点上的迭代器还是值上的迭代器?我想要节点上的迭代器