我正在尝试使用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)
答案 0 :(得分:0)
编写代码的一些问题:
if
块)实际上不会修改树。它只是创建一个新节点并退出而不将新节点链接到树。t.head
以data = -1
开头,因此对t.insert(..., t.head)
的任何后续调用都会点击if
中的insert()
块并且不执行任何操作,如问题1中所述t.print()
head.left.data
时才会发生NullPointerException,但由于此时只有一个节点树,head.left
为空。核心问题是你的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);
}
}