2016-01-14 3 views
2

Я хочу пересечь двоичное дерево справа налево и добавить в очередь каждый элемент с одинаковой фамилией. Я правильно реализую класс списка очередей и класс дерева узлов, но я получаю исключение с нулевым указателем, когда пытаюсь найти что-то. (Конечно, я написал метод вставки для двоичного дерева).Как я могу пересечь двоичное дерево справа налево в java?

public class ST { 


    private TreeNode root; 
    private int size; 
    private Queue q; 


    public Queue searchByLastName(String last_name) { 
      searchByLastNameRec(this.root, last_name); 
      return q; 
     } 

     private void searchByLastNameRec(TreeNode newroot, String last_name) { 
      if (newroot == null) 
       return; 
      if (newroot.right != null) { 
       if (newroot.right.item.getLast_name().equalsIgnoreCase(last_name)) { 
        q.put(newroot.right.item); 
       } 
       searchByLastNameRec(newroot.right, last_name); 
      } 
      if (newroot.left != null) { 
       if (newroot.left.item.getLast_name().equalsIgnoreCase(last_name)) { 
        q.put(newroot.left.item); 
       } 
       searchByLastNameRec(newroot.left, last_name); 
      } 
     } 


public class TreeNode { 
    Suspect item; 
    TreeNode left, right, parent; 
    int N; 

    public TreeNode(Suspect item) { 
     if (item == null) 
      throw new IllegalArgumentException(); 
     this.item = item; 

    } 

} 
+0

Вы, вероятно, получаете NPE на линиях 'если (newroot.right.item.getLast_name() equalsIgnoreCase (last_name).) 'и один для левой. Вы должны проверить, есть ли элемент перед его использованием, только листья будут иметь (должны иметь) предметы. – tkausl

ответ

1

Попробуйте

private void searchByLastNameRec(TreeNode newroot, String last_name) { 
    if (newroot == null || newroot.item == null) 
     return; 
    if (Objects.equals(last_name, newroot.item.getLast_name())) 
     q.put(newroot.item); 
    searchByLastNameRec(newroot.right, last_name); 
    searchByLastNameRec(newroot.left, last_name); 
} 
0

Я предполагаю, что некоторые элементы в вашем дереве имеют значение NULL, или некоторые имеют нулевые имена. Поскольку вы проверяете нулевой элемент при построении узла, я склоняюсь к нему.

Попробуйте это:

public TreeNode(Suspect item) { 
    if (item == null) 
     throw new IllegalArgumentException(); 
    if (item.getLast_name() == null) 
     throw new IllegalArgumentException(); 
    this.item = item; 
}