#java #pointers #null #binary-search-tree
#java #указатели #null #двоичное дерево поиска
Вопрос:
Я использовал драйвер для тестирования одной из своих структур данных (двоичное дерево поиска) и столкнулся с этой проблемой. -Это происходит, когда я вставляю более 2 объектов в bst — Что я пытаюсь сделать: я вставляю 4 объекта в дерево, затем удаляю 2 объекта, а затем распечатываю свой метод find, чтобы он отображал, нашел ли он объекты, которые я запрашиваю. например:
public class Driver5 {
public static void main(Strin&[] ar&s) {
Inte&er c1 = new Inte&er(1);
Inte&er c2 = new Inte&er(2);
Inte&er c3 = new Inte&er(3);
Inte&er c4 = new Inte&er(4);
Inte&er c5 = new Inte&er(5);
Inte&er c6 = new Inte&er(6);
Inte&er c7 = new Inte&er(7);
Inte&er c8 = new Inte&er(8);
Inte&er c9 = new Inte&er(9);
Inte&er c10 = new Inte&er(10);
Inte&er c11 = new Inte&er(11);
Inte&er c12 = new Inte&er(23);
Inte&er c13 = new Inte&er(65);
Inte&er c14 = new Inte&er(45);
Inte&er c15 = new Inte&er(18);
Inte&er c16 = new Inte&er(33);
Inte&er c17 = new Inte&er(54);
DataStructure1<Inte&er&&t; theData = new DataStructure1<Inte&er&&t;();
System.out.println("DS1");
lon& start = System.currentTimeMillis();
theData.insert(c1);
theData.insert(c2);
theData.insert(c3);
theData.insert(c4);
theData.insert(c5);
theData.insert(c6);
theData.insert(c7);
theData.insert(c8);
theData.insert(c9);
theData.insert(c10);
theData.insert(c11);
theData.insert(c12);
theData.insert(c13);
theData.insert(c14);
theData.insert(c15);
theData.insert(c16);
theData.insert(c17);
theData.delete(c2);
theData.delete(c4);
System.out.println(theData.find(c1));
System.out.println(theData.find(c2));
System.out.println(theData.find(c3));
System.out.println(theData.find(c4));
theData.delete(c2);
theData.insert(c3);
System.out.println(theData.find(c2));
System.out.println(theData.find(c3));
System.out.println(theData.find(c4));
System.out.println(theData.find(c5));
System.out.println(theData.find(c6));
System.out.println(theData.find(c7));
System.out.println(theData.find(c8));
System.out.println(theData.find(c9));
System.out.println(theData.find(c10));
System.out.println(theData.find(c11));
System.out.println(theData.find(c12));
System.out.println(theData.find(c13));
System.out.println(theData.find(c14));
System.out.println(theData.find(c15));
System.out.println(theData.find(c16));
System.out.println(theData.find(c17));
lon& elapsed = System.currentTimeMillis() - start;
System.out.println("The time elapsed was: " elapsed " ms.");
System.out.println();
BinarySearchTree<Inte&er&&t; theData1 = new BinarySearchTree<Inte&er&&t;();
System.out.println("BST");
lon& start1 = System.currentTimeMillis();
theData1.insert(c1);
theData1.insert(c2);
theData1.insert(c3);
theData1.insert(c4);
theData1.insert(c5);
theData1.insert(c6);
theData1.insert(c7);
theData1.insert(c8);
theData1.insert(c9);
theData1.insert(c10);
theData1.insert(c11);
theData1.insert(c12);
theData1.insert(c13);
theData1.insert(c14);
theData1.insert(c15);
theData1.insert(c16);
theData1.insert(c17);
theData1.delete(c2);
theData1.delete(c4);
System.out.println(theData1.find(c1));
System.out.println(theData1.find(c2));
System.out.println(theData1.find(c3));
System.out.println(theData1.find(c4));
theData1.delete(c2);
theData1.insert(c3);
System.out.println(theData1.find(c2));
System.out.println(theData1.find(c3));
System.out.println(theData1.find(c4));
System.out.println(theData1.find(c5));
System.out.println(theData1.find(c6));
System.out.println(theData1.find(c7));
System.out.println(theData1.find(c8));
System.out.println(theData1.find(c9));
System.out.println(theData1.find(c10));
System.out.println(theData1.find(c11));
System.out.println(theData1.find(c12));
System.out.println(theData1.find(c13));
System.out.println(theData1.find(c14));
System.out.println(theData1.find(c15));
System.out.println(theData1.find(c16));
System.out.println(theData1.find(c17));
lon& elapsed1 = System.currentTimeMillis() - start1;
System.out.println("The time elapsed was: " elapsed1 " ms.");
}
}
Я получаю ошибку в bst по адресу:
if( nd.&etLeft() == null amp;amp; nd.&etRi&ht() == null)
{
nd = null;
}
полное удаление является:
public void delete(E item) {
TreeNode<E&&t; nd = root;
while(nd != null amp;amp; nd.&etItem().compareTo(item) != 0)
{
if(nd.&etItem().compareTo(item) < 0)
nd = nd.&etRi&ht();
else
nd = nd.&etLeft();
}
if( nd.&etLeft() == null amp;amp; nd.&etRi&ht() == null)
{
nd = null;
}
else if(nd.&etLeft() != null amp;amp; nd.&etRi&ht() == null)
{
nd.setItem((E)nd.&etLeft().&etItem());
}
else if(nd.&etLeft() == null amp;amp; nd.&etRi&ht() != null)
{
nd.setItem((E)nd.&etRi&ht().&etItem());
}
else if(nd.&etLeft() != null amp;amp; nd.&etRi&ht() != null)
{
nd.setItem((E)findsucc(nd));
}
}
Ответ №1:
если nd
есть null,
, то вы не можете вызвать &etLeft()
его. Итак, сделайте свою проверку
if (nd != null amp;amp; nd.&etLeft() == null amp;amp; nd.&etRi&ht() == null)
Просмотрите все причины NullPointerException
, чтобы в следующий раз, когда вы столкнетесь с этим, вы знали, что делать немедленно.
Ответ №2:
nd
по какой-то причине должно быть null. Проверьте это перед вызовом &etLeft()
или &etRi&ht()
на нем.
Комментарии:
1. Узнал кое-что новое, что я должен был знать давным-давно, большое спасибо, peeps ценят вашу помощь
2. @user450267 если ответ вас устроил, отметьте его как принятый (отметьте галочкой под счетчиком голосов)