BST插入在java中使用递归不起作用

时间:2017-10-13 16:00:31

标签: java recursion data-structures binary-search-tree

我正在尝试使用java编写一种递归方式插入到我的二叉搜索树中,但是它无法正常工作会给出空指针异常 我的node.java代码是

public class Node
{
public int data;
public Node left;
public Node right;

public Node()
{
    this.data = -1;
    this.left = null;
    this.right = null;
}
public Node(int n)
{
    this.data = n;
    this.left = null;
    this.right = null;
}
}

我在Tree.java中的代码是

public class Tree
{
public Node head = new Node();

public void insert(int n , Node m)
{
    if(m == null || m.data == -1)
    {
        m = new Node(n);
    }
    else
    {
        if(m.data > n)
        {
            insert(n,m.left);
        }
        else if(m.data < n)
        {
            insert(n,m.right);
        }
    }
}
public void print()
{
    System.out.println(head.data);
    System.out.println(head.left.data);
    System.out.println(head.right.data);
}
}

和test.java代码是

public class Test
{
public static void main(String[] args)
{
    Tree t = new Tree();
    Node m = new Node();
    t.insert(12,t.head);
    t.insert(11,t.head);
    t.insert(13,t.head);
    t.print();
}
}

当我编译并运行时,它会出现以下错误

-1
Exception in thread "main" java.lang.NullPointerException
at Tree.print(Tree.java:28)
at Test.main(Test.java:10)

1 个答案:

答案 0 :(得分:0)

编写代码的一些问题:

  1. 插入的基本情况(if块)实际上不会修改树。它只是创建一个新节点并退出而不将新节点链接到树。
  2. t.headdata = -1开头,因此对t.insert(..., t.head)的任何后续调用都会点击if中的insert()块并且不执行任何操作,如问题1中所述
  3. 只有在您尝试t.print() head.left.data时才会发生NullPointerException,但由于此时只有一个节点树,head.left为空。
  4. 核心问题是你的insert方法没有正确添加节点。它需要实际添加新节点作为当前节点的子树。

    以下是固定代码(可能会简化):

    public class Tree {
        public Node head = new Node();
    
        public void insert(int n , Node m)
        {
            if(m == head && head.data == -1) 
            {
                // if we have an empty tree, just change the head
                head.data = n;
            }
            else if(m.data > n) {
                // we should be adding to the left subtree here
                if(m.left == null) {
                    // if no left subtree, create a new node and link to m's left
                    m.left = new Node(n);
                }
                else {
                    // otherwise call insert on left subtree recursively
                    insert(n, m.left);
                }
            }
            else
            {
                // otherwise add to right subtree
                if(m.right == null) {
                    // no right subtree, so create node and link to m's right
                    m.right = new Node(n);
                }
                else {
                    // call recursively
                    insert(n, m.right);
                }
            }
        }
        public void print()
        {
            System.out.println(head.data);
            System.out.println(head.left.data);
            System.out.println(head.right.data);
        }
    }