2015-06-21 2 views
1

Я недавно изучал двоичное дерево поиска и их реализацию в java. Однако мой вопрос больше связан с obj. ориентированное программирование больше, чем структуры данных. Одним из методов бинарного дерева класса реализуется следующим образом:Проблема смены данных

protected BinaryNode<AnyType> findMin(BinaryNode<AnyType> t) 
{ 

    //BinaryNode<AnyType> k= new BinaryNode<AnyType>(x); 
    if(t != null) 
     while(t.left != null) 
     { 
      t=t.left; 


     } 
    return t; 
} 

Теперь, если вместо «т» я поставил «корень» возвращаются данные minimimum элемент двоичного дерева, но в конце концов Безразлично» Этот метод изменяет значение «root»? На самом деле я знаю, что это не меняет, но я не понимаю, почему.

+0

Прежде чем мы смогли ответить на это объективно, можем ли мы предположить, что 'AnyType' содержит метод getValue()', который разрешает какой-то «номер»? Или что 'AnyType' реализует' Comparable'? – Makoto

ответ

0

Вы не хотите изменять фактическое значение root, поэтому вы используете t. И вызовите метод, передающий root. Корень остается неизменным и т делает всю работу.

2

Ничего не меняется в дереве. t - временная замена любого узла, который вы вставляете в метод. Это то же самое, когда вы могли бы сделать это:

int x = 5; 
int y = x + 1; 
System.out.println(x); 
System.out.println(y); 

Выход все равно будет:

+0

Да, но в этом случае x, y являются примитивными типами данных, и я думал, поскольку «t» - это объект, который передается по ссылке, поэтому корень должен меняться. – enu

1

Метод изменяет значение параметра метода из стека, и это значение является ссылкой. Таким образом, вы изменяете ссылку (это означает, что она указывает на что-то другое, на другую область памяти), а не на значение, указанное ссылкой (а не на содержимое этой области памяти).

1

Я думаю, что этот метод плохо назван. Что этот метод делает, так это то, что он выполняет итерацию через левые узлы, пока не достигнет самого левого листа, а затем вернет его. __Update__ Вторая мысль: на самом деле левый самый лист - это минимальный узел дерева. Так что это имеет смысл. Виноват.

Вы не должны изменять корень дерева. Это ваша точка входа. Напротив, вы хотите это запомнить. Если это сбалансированное дерево, то оно удерживает среднюю точку (или центр веса) дерева. Поэтому это важно.

+0

Удерживайте телефон; это [двоичное дерево] (https://en.wikipedia.org/?title=Binary_tree), не обязательно [двоичное * дерево поиска] (https://en.wikipedia.org/wiki/Binary_search_tree). Там * есть * разница между ними. Я не уверен, что повторение всех левых - это правильный подход. – Makoto

+0

в вопросе @ ЭлиоНуши упомянул, что это дерево поиска бинарта., Правильно? – Alp

+0

Все, что я вижу, это то, что он упоминает, что он изучает его, не обязательно, что мы показываем * - это BST. – Makoto

1

Когда вы вызываете метод в java, вы передаете объект по ссылке в новую переменную, называемую «t» в вашем методе findMin. Вы изменяете ссылку «t» в своем блоке, вот и все. Но не ваш узел корня дерева.

Возьмите это как небольшой тест:

public class RefTest { 

    static String nameM2 = "Italy"; 

    public static void main(String[] args) { 

     String nameM = "Spain", nameF = "France"; 

     System.out.println(nameM+", "+nameF); 
     change(nameM); 
     System.out.println(nameM+", "+nameF); 
    } 

    private static void change(String param) { 
     param = nameM2; 
    } 
} 

Если вы запускаете его, это не выход:

Spain, France 
Italy, France 

Вместо этого:

Spain, France 
Spain, France 

Потому что вы изменил ссылку в объекте param, но никогда не используется снова после выхода из метода изменения.

Смежные вопросы