Вставка в двоичное дерево не работает с использованием java

В настоящее время я изучаю деревья с помощью java и у меня здесь происходят некоторые ошибки при вставке элементов в двоичное дерево Я не понимаю, почему это не работает

это код: узел дерева:

public class TNode {
    int data;
    TNode left;
    TNode right;

    public TNode(int data) {
        this.data = data;
        left = null;
        right = null;
    }
}

класс дерева:

public class Tree {
    TNode root;

    public Tree(){
        root = null;
    }

    public TNode insertNode(TNode item, int d) {
        if (item == null) {
            return new TNode(d);
        }

         if (d < item.data) {
            item.left = insertNode(item, d);
        }

        if (d > item.data) {
            item.right = insertNode(item, d);
        } else {
            return item;
        }

        return item;
    }

    public void add(int d) {
        insertNode(root, d);
    }
}

Всякий раз, когда я добавляю элемент, корень остается нулевым без правых или левых элементов Если кто-то может помочь, я буду очень благодарен

..поскольку вы никогда не назначаете root (на что-то другое, кроме null), пожалуйста, сделайте (вероятно, лучший дизайн) в методе add: if (root == null) { root = insertNode(root, d); } else { insertNode(root, d); }

xerx593 05.05.2018 22:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
133
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

root всегда равен нулю, потому что вы никогда не присваиваете ему значение.

вы можете добавить в начало проверки метода и назначить его

public TNode insertNode(TNode item, int d){
    if (item == null){
        TNode node = new TNode(d);
        if (root == null) { 
            root = node;
        }
        return node
    }
    ... rest of method isn't changed...

Кроме того, при рекурсии вы должны выполнять вызов с правильным дочерним узлом вместо того, чтобы всегда вызывать с помощью item, поэтому, например, первым случаем будет:

    item.left = insertNode(item.left, d);

Во втором случае вы могли бы просто использовать item.right.

"корень = ню;" вероятно должно быть "root = node;" xD хороший

Frank Haubenreisser 05.05.2018 23:02

Прекрасный код, но рекурсия не продвигается дальше

item.left = insertNode(item.left, d);
item.right = insertNode(item.right, d);

И исходный рут не обновляется:

root = insertNode(root, d);

Остальная часть или окончательный возврат излишни.


Кое-что о стиле кода

insertNode имеет узел в качестве входа и возвращает обновленное значение узла, поэтому вызов «шаблон» должен выглядеть так:

X = insertNode(X, d); // X is some expression

Это связано с тем, что java никогда не может присвоить переданному выражению аргумента: у него нет передачи по ссылке, а есть передача по значению; f(x) никогда не назначается x.

Другие вопросы по теме