2015-08-18 2 views
0

Я попытался написать рекурсивную функцию для добавления узлов в двоичное дерево.
Проблема заключается в том, что, хотя корень имеет новое значение после вставки первого элемента
(подтвержденным System.out.println()), он по-прежнему равен нулю, когда я пытаюсь получить значение корня в главной системе .out.println();Binary Tree insert root always null

package polo; 

public class BTNode { 
    public int value; 
    public BTNode left; 
    public BTNode right; 

    BTNode(int value){ 
     this.value = value; 
     left = null; 
     right = null; 
    } 
} 

package polo; 

public class Tree { 
public BTNode root; 

    public Tree() { 
     root = null; 
    } 

    public void add(int i, BTNode n) { 
     if (n == null) { 
      n = new BTNode(i); 
      System.out.println("New root value : " + n.value); 
     } else { 
      if (i < n.value) { 
       if (n.left == null) { 
        n.left = new BTNode(i); 
       } else { 
        add(i, n.left); 
       } 
      } else { // i >= n.value 
       if (n.right == null) { 
        n.right = new BTNode(i); 
       } else { 
        add(i, n.right); 
       } 
      } 
     } 
    } 

    public static void main(String[] args) { 
     Tree t = new Tree(); 
     t.add(3, t.root); 

     System.out.println(t.root.value); 
    } 
} 

Выход командной строки:

Новый корень значение: 3

Исключение в потоке "основного" java.lang.NullPointerException в поло. Tree.main (Tree.java:57)

(строка 57 - это где System.out.println (t.root.value); стенды)

+0

Извините, но я не понимаю ваш комментарий. Корень является нулевым, когда нет элемента, но после вставки нового (root = new Node()) он не должен быть пустым? –

+2

@HovercraftFullOfEels Это не распространенный смысл, если вы не понимаете, как Java передает параметры функциям (есть «n = ...», которые могут показаться измененными «root»). – Dukeling

+0

В стороне: создайте это дерево таким образом, чтобы вызывающий только когда-либо передавал значение, которое они хотели бы добавить к нему. Не позволяйте им ничего знать о структуре внутренних узлов. – Makoto

ответ

2

В Java есть ссылки, но не ссылки на ссылки.

Если у вас есть

public void add(int i, BTNode n) { 
    if (n == null) { 
     n = new BTNode(i); // alters the local variable n only. 

В основном add не изменяет t.root. Вместо этого вы не должны пройти root и использовать метод add.

public void add(int i) { 
    if (root == null) { 
     root = new BTNode(i); 
    } else { 
     root.add(i); 
    } 
} 
+0

Я столкнулся с проблемой OP раньше, и теперь мне интересно, есть ли язык, на котором есть ссылки на ссылки? И мне интересно, может ли язык справиться с этой проблемой, было бы более полезно, чем запутывать? – bourbaki4481472

+0

Благодарим вас за дружеский ответ. Это решило мою проблему. –

+1

@ bourbaki4481472 C/C++ имеет '&& n' и' * & n' и '& * n' и' ** n', а также указатели на указатели на указатели, которые могут быть полезны в некоторых структурах данных. (очень редко) –