用Java编写二叉树的泛型迭代器
我想为BinaryTree编写一个自定义迭代器。此迭代器应返回用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
节点
对象。在递归调用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键,左节点,右节点){
。您真的想要节点上的迭代器还是值上的迭代器?我想要节点上的迭代器