2014-09-26 2 views
-1

Я знаю, что здесь есть много подобных вопросов. Я смотрел на них, но реализация каждого из них различна, и это меня просто сбивает с толку. Я пытаюсь создать двоичное дерево. Каждый раз, когда я вставляю элемент, он становится корнем, который не является тем, что я хочу. Если я попытаюсь получить доступ к данным в корневом каталоге из основного метода или передать корень другому методу, я получаю исключение нулевого указателя. Может ли кто-нибудь сказать мне, почему мой корень всегда равен нулю и почему мой метод insert не присваивает значение корню? Любые советы по лучшему дизайну для структур данных в Java также будут высоко оценены.двоичное дерево всегда null

package interviewQuestions; 

public class BinaryTree { 
    private Node root = null; 

    private class Node { 
     int data; 
     Node left; 
     Node right; 

     public Node(int dataval){ 
      data = dataval; 
      left = null; 
      right = null; 
     } 
    } 

    // A binary search tree must have no duplicate nodes 
    // Insert nodes into the tree. Return 1 on success. 
    public int insert(Node root, int data){ 
     Node temp = root; 
     if(root == null){ 
      Node node = new Node(data); 
      root = node; 
      System.out.println("new root is "+root.data); 
      return 1; 
     } 
     else if(temp.data < data && temp.right != null){ 
      if(data < temp.right.data){ 
       Node node = new Node(data); 
       node.right = temp.right; 
       temp.right = node; 
       return 1; 
      } 
      else{ 
       temp = temp.right; 
       insert(temp, data); 
      } 
     } 
     else if(temp.data < data && temp.right == null){ 
      Node node = new Node(data); 
      temp.right = node; 
      return 1; 
     } 
     else if(temp.data > data && temp.left != null){ 
      if(data > temp.left.data){ 
       Node node = new Node(data); 
       node.left = temp.left; 
       temp.left = node; 
       return 1; 
      } 
      else{ 
       temp = temp.left; 
       insert(temp, data); 
      } 
     } 
     else if(temp.data > data && temp.left == null){ 
      Node node = new Node(data); 
      temp.left = node; 
      return 1; 
     } 
      return -1; 
    } 

    public void preOrder(Node root){ 
     if(root.left != null){ 
      System.out.println(root.data); 
      root = root.left; 
      preOrder(root); 
     } 
     else if(root.left == null && root.right != null){ 
      System.out.println(root.data); 
      root = root.right; 
      preOrder(root); 
     } 
     else if(root.left == null && root.right == null){ 
      return; 
     } 
    } 

    // Remove 

    // Find 

    // Balance 


    public static void main (String[] args){ 
     BinaryTree tree = new BinaryTree(); 

     tree.insert(tree.root, 5); 
     tree.insert(tree.root, 2); 
     tree.insert(tree.root, 8); 
     tree.insert(tree.root, 1); 
     tree.insert(tree.root, 3); 
     tree.insert(tree.root, 9); 
     tree.insert(tree.root, 20); 
     tree.insert(tree.root, 10); 
     tree.insert(tree.root, 15); 

     System.out.println(tree.root); 
     tree.preOrder(tree.root); 
     System.out.println("Ya. everysing ees güten tag. YA."); 
    } 
} 
+0

Вы должны выяснить, выполнив некоторую отладку. –

+4

Почему вы передаете корневую переменную, когда root является частной переменной в вашем классе? Исправьте инструкцию insert, чтобы получить только данные 'data' и изменить корень частной переменной на равный узел. Ваш метод заставляет его установить параметр 'root' в' node'. Это не приводит к изменению корня классов. – Grice

+0

Также вы никогда не писали метод 'toString()' для класса 'Node', поэтому' System.out.println (tree.root) 'просто сбрасывает имя объекта (например, BinaryTree $ Node @ 1db9742) – Grice

ответ

1

Вы передаете корневую переменную, когда root является частной переменной в вашем классе. Исправьте инструкцию insert, чтобы получать данные и изменять собственный корень переменной в равный узел.

Ваш метод заставляет его установить корень параметра на узел. Это не приводит к изменению корня классов.

Вам не нужно изменять видимость корня. Когда вы вводите инструкцию insert, у вас есть 2 разных корневых переменных в вашем коде; корень, который вы объявили в своем классе, и корень, который вы передали в качестве параметра. Вам нужен только тот, который находится в классе

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