2016-01-29 2 views
0

Корень всегда равен нулю.Рекурсивный BST Вставка не задает корневую Java

Это не домашнее задание, просто попытка расширить мои знания. Я пытаюсь рекурсивно вставлять узлы в двоичное дерево. Я сделал несколько поисков здесь, но каждая реализация настолько отличается, эти изменения не работают.

Это мой BinaryTree класс:

public class BinaryTree { 

    static Node root; 

    public static void insertNode(int data){ 

     if(root != null){ 

      root.printData(); 
      insertNew(root, new Node(data)); 

     }else{ 

      root = insertNew(root, new Node(data)); 

     } 

    } 


    private static Node insertNew(Node current, Node n){ 


     if(current == null){ 

      return n; 


     }else if(current.data > n.data){ 

      current.left = insertNew(current.left, n); 
      return current; 

     }else if(current.data < n.data){ 

      current.right = insertNew(current.right, n); 
      return current; 
     } 

     return current; 

    } 

    public static void main(String[] args){ 


     insertNode(9); 

    } 


} 

И это мой узел:

class Node { 

    int data; 
    Node left; 
    Node right; 

    Node(int data){ 

     this.data = data; 

    } 

    public int printData(){ 

     System.out.println(this.data); 
     return this.data; 
    } 
} 

Каждый раз, когда я запускаю это, он предполагает, что корень нуль. У меня есть отладочные строки печати в рабочем коде, поэтому я могу указать, где я нахожусь в методах. Он поражает первый if в функции insertNew() каждый раз.

Я хотел бы концептуально понять, где я терплю неудачу.

+1

@ChiefTwoPencils Это больше ради знаний, чем все остальное. Я делаю чек, чтобы гарантировать, что значение 'root' имеет значение. Вот почему это убивает меня, чего никогда не бывает. После первого вызова 'insertNode()', 'root' всегда должен иметь значение. – Phoenix

+2

@Phoenix Это работает, когда я запускаю его. Однако вам нужно вставить другой узел, прежде чем root не будет «null». Например, добавьте 'insertNode (10)' к вашему основному методу. Java не сохраняет значения или структуры данных между циклами. – River

+0

Это действительно работает ... – ChiefTwoPencils

ответ

1

Возможно, вы не знаете, что каждый раз, когда вы запускаете свою программу, она инициализирует все данные в ОЗУ с нуля? В другом случае, может быть, ваша ошибка в том, что вы предполагаете, что root.data будет напечатано после первой вставки. Вы должны сделать не менее 2 вставок, чтобы ваш код напечатал что-то, потому что при первой вставке корень всегда равен нулю.

Вы можете легко выяснить проблему, если пытались отладить:

enter image description here

+0

Спасибо за ответ, похоже, я просто не понял, как Java хранит объекты в памяти, и я все еще неясен в практических приложениях BST за пределами академических кругов. – Phoenix

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