Java массив общих узлов в двоичном дереве, не может создать ноль - PullRequest
0 голосов
/ 04 июля 2019

У меня похожая проблема, как в этом вопросе: Массив общих узлов Java

Однако статический вложенный класс Node решает одну проблему, но создает другую для меня. Я написал двоичное дерево, и каждый раз, когда указатель узла не должен указывать на что-либо (например, левый и правый указатели конечного узла или родительский указатель корня), он фактически указывает на специальный узел «nil», который не содержит соответствующих данных. Nil является переменной-членом двоичного дерева.

Когда я создаю узел, конструктор заставляет все указатели указывать на ноль. Однако, если я сделаю класс Node статическим, чтобы я мог создать массив узлов (что мне нужно сделать для конкретного метода), я получу ошибку для каждого указателя, которая говорит: «Невозможно сделать статическую ссылку на нестатическое поле ноль «. Но если я изменяю nil на статический, я получаю ошибку, которая говорит: «Невозможно сделать статическую ссылку на нестатический тип T». (Мои узлы содержат объекты параметризованного типа.)

Вот мой класс Node:

protected static class Node<T>{
    Node left, right, parent;
    T object;

    protected Node(T x) {
        object= x;
        left= nil;
        right= nil;
        parent= nil;
    }
}

Это нулевое обозначение и конструктор двоичного дерева, который создает нулевой узел и делает его корнем:

protected static Node<T> nil;

public BT() {
    nil= new Node<T>(null);
    root= nil;
}

Как я могу позволить себе создать массив узлов, не сталкиваясь с этими статическими или нестатическими проблемами?

1 Ответ

2 голосов
/ 04 июля 2019

Во-первых, никогда не используйте raw generics, поэтому укажите <T> в полях Node:

protected static class Node<T> {
    Node<T> left, right, parent;
    T object;

Далее для инициализации nil необходим конструктор разностей:

protected Node() {
    left = this;
    right = this;
    parent = this;
}

Теперь вы можете инициализировать nil как нестатический объект, чтобы сохранить безопасность типов:

protected Node<T> nil = new Node<>();

Однако вместо создания nil объекта для каждого дерева создайте статический метод:

@SuppressWarnings("rawtypes")
private static Node NIL = new Node();

@SuppressWarnings({ "cast", "unchecked" })
protected static <T> Node<T> nil() {
    return (Node<T>) NIL;
}
...