二进制搜索树插入错误

时间:2016-07-29 18:37:54

标签: java nullpointerexception binary-search-tree insertion

package array;

import java.util.Scanner;

class node<T>{
    T data;
    node<T> left;
    node<T> right;
}
public class binarytree {

    public static void main(String [] args){
    node<Integer> root = null;
    node<Integer> n = new node<>();
    Scanner s = new Scanner(System.in);
    root=create(s.nextInt());
    System.out.println("root creates");
    //root=insert(n,root);
    for(int i =1;i<6;i++){
        n=create(s.nextInt());
        insert(n,root);
        System.out.println(i+"th inserted ");
        inorder(root);
        System.out.println();
    }
    }
    private static void inorder(node<Integer> root) {
        if(root==null){
            return;
        }
        inorder(root.left);
        System.out.print(root.data+" ");
        inorder(root.right);
        return;
    }
    private static void insert(node<Integer> n, node<Integer> root) {
        if(root.left==null&&root.right==null){//line 37
            if(root.data>n.data){
                root.left=n;
            }
            else{
                root.right=n;
            }

        }
        else if(root.data>n.data){
            insert(n, root.left);//line 47
        }
        else{
            insert(n, root.right);
        }

        return ;
    }
    private static node<Integer> create(int data) {
        node<Integer> n = new node<>();
        n.data=data;
        n.left=n.right=null;
        return n;
    }
}

代码适用于正小整数,但是通过某些输入(例如:

)给出空指针异常
2 -3 1 -44 

然后停止并给出nullpointer异常。

然而,有这样的一些,它工作正常

6 4 3 2 1 

堆栈追踪:

Exception in thread "main" java.lang.NullPointerException
    at array.binarytree.insert(binarytree.java:37)
    at array.binarytree.insert(binarytree.java:47)
    at array.binarytree.insert(binarytree.java:47)
    at array.binarytree.main(binarytree.java:21)

1 个答案:

答案 0 :(得分:0)

root.left == null为false并允许root.right失败时,插入中的if语句是短路的,然后在递归中向下传递root.right,该递归为空。或者你的树是空的,根只是空的。

尝试重新构建

private static void insert(node<Integer> n, node<Integer> root) {
    if (n == null) return;
    if (root == null) {
       // TODO: Set the root? 
    }  

    Integer data = n.data;
    Integer rootData = root.data;

    if (data < rootData) {
        if(root.left == null){
            root.left = n;
        }
        else{
            insert(n, root.left);
        }
    }
    else if(data >= rootData){
        if (root.right == null) {
            root.right = n;
        } else {
            insert(n, root.right);
        }   
    }
}