Java 为什么在我的代码中为空对象赋值不起作用?我的代码有一个用于二进制搜索树的简单插入函数:

Java 为什么在我的代码中为空对象赋值不起作用?我的代码有一个用于二进制搜索树的简单插入函数:,java,nullpointerexception,Java,Nullpointerexception,现在在二进制搜索树类中,我有一个插入函数: public class Node { Node left; Node right; int value; public Node(int value){ this.value = value; this.left = null; this.right = null; } public void printValue(){

现在在二进制搜索树类中,我有一个插入函数:

    public class Node {

    Node left;
    Node right;
    int value;

    public Node(int value){

          this.value = value;
          this.left = null;
          this.right = null;
    }

    public void printValue(){

       System.out.println("Node value = "+this.value);
    }  
    }
此代码在打印根目录后出现空指针异常。当“当前”值为空时,“插入”函数中未分配该值

但是,以下对insert函数的修改可解决此错误:

    public class GTDriver {

public static void main(String[] args) {

    BinarySearchTree bt = new BinarySearchTree(50);
    bt.insert(45, bt.root);
    bt.insert(65, bt.root);

    bt.root.printValue();
    bt.root.left.printValue();
    bt.root.right.printValue();
}

    }
public void插入(int值,节点根){
节点电流=根;
节点n=新节点(值);
while(当前!=null){
如果(值>当前值)
if(current.right!=null)
current=current.right;
否则{
current.right=n;
打破
}
否则如果(值<当前值)
if(current.left!=null)
current=current.left;
否则{
当前左=n;
打破
}
}           
}
为什么上一个插入功能不起作用?

    public void insert(int value, Node root){

    Node current = root;      
    Node n = new Node(value);

    while(current != null){

        if (value > current.value)  
            if (current.right != null)
              current = current.right;
            else{
                current.right = n;
                break;
            }
        else if (value < current.value)
            if (current.left != null)
                current = current.left;
            else{
                current.left = n;
                break;
            }
    }           
    }
两者

为null,因此您将获得NullPointerException

公共void插入(int值,节点根){

节点电流=根;
节点n=新节点(值);
while(当前!=null){
如果(值>当前值)
current=current.right;
否则如果(值<当前值)
current=current.left;
}
current=n;//n.right=null和n.left=null。因此,current.right和current.left=null。
}
在第二种情况下

Node current = root;      
Node n = new Node(value);
while(current != null){

             if (value > current.value)
                   current = current.right;   
             else if (value < current.value)
                   current = current.left;    
      }

      current = n;  // n.right=null and n.left=null. So, current.right and current.left=null.

}
if(值>当前值)
if(current.right!=null)
current=current.right;
否则{
current.right=n;//right!=null
打破
}
否则如果(值<当前值)
if(current.left!=null)
current=current.left;
否则{
current.left=n;//left!=null

分析非常简单。在您的第一个插入版本中,您的根对子节点的引用为null(左侧和右侧为null)。插入方法实际上不起任何作用,因为:

 if (value > current.value)  
            if (current.right != null)
              current = current.right;
            else{
                current.right = n;   //right!=null
                break;
            }
        else if (value < current.value)
            if (current.left != null)
                current = current.left;
            else{
                current.left = n;   // left!=null
节点电流=根;
节点n=新节点(值);
while(当前!=null){
如果(值>当前值)
current=current.right;//空赋值!
}否则如果(值<当前值){
current=current.left;//空赋值!
}
}
//这里的电流为零

然后创建一个新节点n,但忘记将其分配到根节点的左侧和右侧。

插入时忘记分配左侧和右侧节点

我建议使用递归,而不是使用迭代方法。这很容易

    Node current = root;      
    Node n = new Node(value);
    while (current != null) {
          if (value > current.value)
                 current = current.right; // null assignment!
          } else if (value < current.value) {
                 current = current.left; // null assignment!
          }
     }

 // here current is null

编辑:我只是编辑了这篇文章以使其正确。

回答错误!当您在根变量中传递null值时,这段代码会出现null指针异常。您所犯的错误将在下面的问题中讨论:哦,好吧,我的错误。我还没有在java上测试过这个
Node current = root;      
Node n = new Node(value);
while(current != null){

             if (value > current.value)
                   current = current.right;   
             else if (value < current.value)
                   current = current.left;    
      }

      current = n;  // n.right=null and n.left=null. So, current.right and current.left=null.

}
 if (value > current.value)  
            if (current.right != null)
              current = current.right;
            else{
                current.right = n;   //right!=null
                break;
            }
        else if (value < current.value)
            if (current.left != null)
                current = current.left;
            else{
                current.left = n;   // left!=null
    Node current = root;      
    Node n = new Node(value);
    while (current != null) {
          if (value > current.value)
                 current = current.right; // null assignment!
          } else if (value < current.value) {
                 current = current.left; // null assignment!
          }
     }

 // here current is null
public void insert(int value, Node root){
     if (root == null) {
        root = new Node(value);
     } else {
        if (root.getValue() >= value) {
           if (root.getRight() == null) {
               root.setRight(new Node(value));
           } else {
               root.insert(value, root.getRight());
           }
        } else {
           if (root.getLeft() == null) {
               root.setLeft(new Node(value));
           } else {
               root.insert(value, root.getLeft());
           }
        }
     }
}