Написание универсального итератора на Java для двоичного дерева - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу написать собственный итератор для BinaryTree.Этот итератор должен возвращать Node<?> объектов.Я получаю ошибку компиляции в файле InorderIterator в строках с рекурсивным вызовом fillList: 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);
    }
}

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Вы должны явно указать, что вы используете 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();
    }
}
1 голос
/ 11 апреля 2019

Возможно, вам следует сделать что-то подобное:

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();
    }
}
...