Как я могу заставить мою функцию вставки бинарного дерева работать? - PullRequest
0 голосов
/ 09 мая 2019

/ Решено / Я фактически прошел ноль. Поскольку он не содержит никакой информации, добавление значений к нему не повлияет на мое дерево, спасибо за ответ!

У нас в Java есть задача создать двоичное дерево, которое может содержать целое число. Мы должны написать функцию вставки, которая по совпадению вставляет целое число в дерево. Я сейчас написал функцию, но почему-то она не добавляет введенные значения.

Мой класс состоит из целого числа "value" и двух ссылок на левую и правую ветви "left" и "right". Кроме того, я должен написать эту функцию таким образом, чтобы они возвращали void, я знаю, что есть более простые способы.

Итак, на данный момент я уже знаю, что я добираюсь до листа. Тогда это т == ноль. Когда я пытаюсь, то ставлю "t = new CONSTRUCTOR (value, ...)" это ничего не меняет.

public void insert_in_tree(int i) {
    /*Creating random number*/
    Random rand = new Random();
    int rand_num = rand.nextInt(2);
    if(rand_num == 0) { 
        setLeft(this.left, i);
    } else {
        setRight(this.right, i);
    }
}

... вот код для функции "setLeft" (функция "setRight" такая же, я просто передаю правильное поддерево, когда вызываю его):

void setLeft(IntBinTree t, int value) {
    if(t == null) {
        t = new IntBinTree(value, null, null);
        return;
    }
    int i = 0;
    /*Random number*/
    Random rand = new Random();
    int rand_num = rand.nextInt(2);
    /*Calling either left or right*/
    if(rand_num == 0) setLeft(t.left, value);
    setRight(t.right, value);
}

Полагаю, ошибка вызывает функцию и затем изменяет локальную переменную "t" вместо использования "this". Однако, так как я передаю ссылку «это», не должно быть никаких проблем с этим, кто-нибудь может обнаружить ошибку?

1 Ответ

0 голосов
/ 09 мая 2019

Вы передаете нуль в функцию.НЕ объект.

Если вы передали объект (например, «this»), он передаст ссылку на этот объект (на самом деле Java это « Pass by value », но чтовы передаете по значению ссылку, а не сам объект), и любые изменения в ней будут отражаться за пределами функции.

Передача нулевого значения НЕ будет делать это, поскольку нет ссылки на объект, а вы просто передаете значениеиз «null», который НИЧЕГО не имеет отношения к вашему исходному объекту, поэтому любые изменения «t», сделанные во второй функции, будут потеряны.

То, что вы должны сделать, - это одна из двух вещей:

  1. Передайте "this" и флаг влево / вправо.

  2. Создайте левое / правое поддерево (если оно пустое) в вызывающей программе, передайте вновь созданное иназначенное поддерево.

Кстати, у вас есть почти идентичный код для левого / правого в методе верхнего уровня и в методе set - было бы легче сохранить его полностью в методе set.

...