从事家庭作业,这里是代码:
public void insert(E value){
Node addative= new Node(value, null, null);
Node current=this.root;
if(current==null){
this.root = addative;
size++;
return;
}
System.out.println("root is: "+root.value+" value is: "+value);
while(true){
//System.out.println("current is currently: "+current.value);
if(null==current.lesser)System.out.println("lesser is null");
else System.out.println("lesser is: "+current.lesser.value);
if(null==current.greater)System.out.println("greater is null");
else System.out.println("greater is: "+current.greater.value);
//if slot is empty and addative belongs here
if(current.lesser==null&¤t.value.compareTo(addative.value)>0){
System.out.println("was added lesser");
current.lesser=addative;
break;
}
//if slot is empty and addative belongs here
if(current.greater==null&¤t.value.compareTo(addative.value)<=0){
System.out.println("was added greater");
current.greater=addative;
break;
}
System.out.println("here");
//no valid empty slots ergo continue along tree
if(current.value.compareTo(addative.value)>0)current=current.lesser;
if(current.value.compareTo(addative.value)<=0)current=current.greater;
}
size++;
System.out.println("next word");
}
这是打印输出:
root是:橘子的价值是:怀疑论者 较小的是空的 greater为null 添加较少 下一个字 root是:橘子的价值是:袋熊 较小的是:怀疑论者 greater为null 增加了更多 下一个字 root是:tangerines值是:valeting 较小的是:怀疑论者 更大的是:袋熊 这里 较小的是空的 greater为null 添加较少 下一个字 root是:橘子的价值是:泡沫 较小的是:怀疑论者 更大的是:袋熊 这里 较小的是空的 greater为null 添加较少 下一个字 根是:橘子的价值是:鸽子 较小的是:怀疑论者 更大的是:袋熊 这里 较小的是:泡沫 greater为null 这里
Exception in thread "main" java.lang.NullPointerException
at BinarySearchTree.insert(BinarySearchTree.java:35)
at BinarySearchTree.main(BinarySearchTree.java:178)
第35行说:
if(null==current.lesser)System.out.println("lesser is null");
我是否尝试将null引用错误?我不明白这可以增加5-10个单词并且可以正常工作,但是在第11次它出错了。
答案 0 :(得分:0)
您要将null
分配给您当前的地址:
// before adding 'pigeonhole':
tangerines
skeptics wombats
bubble null valeting null
现在,在'怀疑论者',"skeptics".compareTo("pigeonhole") < 0
时,您设置current = current.greater
,即current = null
。在下一次迭代中,您调用current.lesser
,这会产生NPE。
这里的问题是你自己说'没有有效的空位'并在那之后立即分配它们。您应该更改逻辑,以便在未在当前级别执行插入时,current
分配不仅基于compareTo
结果,还基于条目“null
状态为好。 E.g:
// pigeonhole < skeptics, hence
if (current > addative && current.lesser != null) {
current = current.lesser;
}
// and something like that for the 'greater' case
无论如何,你应该使用旧的铅笔纸调试,因为如果你试图手动重现这些步骤,很容易发现这个bug。实际上,你应该在之前使用这个方法开始编写算法代码,因为看起来对你的实现的正确性的正式评估不是你最强的一面,并写下你的程序的每一个可能的步骤是培养这种技能的最佳方式。