Получение NullPointerException при вставке элемента в BST - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь вставить элемент в дерево двоичного поиска итеративным методом, но получаю исключение NullPointerException и не могу понять, почему возникает эта ошибка. Я попытался изменить цикл и проверить темп, но я не понял, что там происходит неправильно. РЕДАКТИРОВАТЬ: - Я добавил весь код.

     import java.util.*;
  import java.io.*;

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

      Node(int data) {
          this.data = data;
          left = null;
          right = null;
      }
  }

  class Solution {

      public static void preOrder(Node root) {

          if (root == null)
              return;

          System.out.print(root.data + " ");
          preOrder(root.left);
          preOrder(root.right);

      }

      /* Node is defined as :
      class Node 
         int data;
         Node left;
         Node right;

         */

      public static Node insert(Node root, int data) {

          Node inserter = new Node(data);
          Node temp = root;
          while (true) {
              if (inserter.data <= temp.data) {
                  if (temp.left == null) {
                      temp.left = inserter;
                      break;
                  } else
                      temp = temp.left;

              } else {
                  if (temp.right == null) {
                      temp.right = inserter;
                      break;
                  } else
                      temp = temp.right;

              }
          }

          return root;
      }

      public static void main(String[] args) {
          Scanner scan = new Scanner(System.in);
          int t = scan.nextInt();
          Node root = null;
          while (t-- > 0) {
              int data = scan.nextInt();
              root = insert(root, data);
          }
          scan.close();
          preOrder(root);
      }
  }

Ответы [ 2 ]

1 голос
/ 18 июня 2019
public static void main(String[] args) {
      Scanner scan = new Scanner(System.in);
      int t = scan.nextInt();
      Node root = null;
      while (t-- > 0) {
          int data = scan.nextInt();
          root = insert(root, data);
      }
      scan.close();
      preOrder(root);
  }

В основном методе вы передаете root == null

Вам нужно переписать ваш insert метод , тогда он будет работать

public static Node insert(Node root, int data) {

          // check if root == null then initialize root and return it
          if(root == null){ 
               return new Node(data);
          }
          //--------

          Node inserter = new Node(data);
          Node temp = root;
          while (true) {
              if (inserter.data <= temp.data) {
                  if (temp.left == null) {
                      temp.left = inserter;
                      break;
                  } else
                      temp = temp.left;

              } else {
                  if (temp.right == null) {
                      temp.right = inserter;
                      break;
                  } else
                      temp = temp.right;

              }
          }

          return root;
      }
0 голосов
/ 18 июня 2019

Ваша проблема в вашем основном методе:

  public static void main(String[] args) {
      Scanner scan = new Scanner(System.in);
      int t = scan.nextInt();
      Node root = null;
      while (t-- > 0) {
          int data = scan.nextInt();
          root = insert(root, data);
      }
      scan.close();
      preOrder(root);
  }

Вы инициализируете Node root = null, и при первом входе в цикл while root по-прежнему будет нулевым при передаче его методу вставки: root = insert(root, data);

public static Node insert(Node root, int data) {
  Node inserter = new Node(data);
  Node temp = root;
  while (true) {
    if (inserter.data <= temp.data) {
    ...

Таким образом, при первом вводе метода вставки значение temp будет равно нулю, давая нулевой указатель на temp.data в строке if (inserter.data <= temp.data).

...