这是我在Java中实现的BST。
public class BST {
Node root;
public BST(){
root = null;
}
// public BST(int item){
// root = new Node(item);
// }
private class Node{
int data;
Node left;
Node right;
public Node(int data){
this.data = data;
this.left = null;
this.right = null;
}
}
public void add(int item){
add(item, root);
}
private Node add(int item, Node p ){
if(p == null){
p = new Node(item);
}
else if(item < p.data) p.left = add(item, p.left);
else if(item > p.data) p.right = add(item, p.right);
return p;
}
public void inorder(){
inorder(root);
}
private void inorder(Node p){
if(p == null) return;
inorder(p.left);
System.out.print(p.data + " ");
inorder(p.right);
}
}
这是主叫代码。
public class Main {
public static void main(String[] args) {
// write your code here
//BST bst = new BST(13);
BST bst = new BST();
bst.add(12);
bst.add(7);
bst.add(3);
bst.add(2);
bst.add(19);
bst.add(4);
bst.add(17);
bst.add(11);
bst.inorder();
}
}
这里的问题是当我使用BST参数化构造函数时,一切都按预期工作。但是如果我不使用默认构造函数,则root继续保持null
并且不会添加任何内容。似乎无法理解为什么会这样。调试器在null pointer exception
帮助程序调用中提供add
。但是,如果null add
是调用者,则定义root
的方式,那么应该没有例外。我的问题是为什么BST默认构造函数不起作用?
答案 0 :(得分:1)
在此方法private Node add(int item, Node p )
中,您将返回p
,但public void add(int item)
不会存储它。所以基本上你返回的任何对象都没有引用。
变化:
public void add(int item){
add(item, root);
}
到:
public void add(int item){
if (root == null)
root = add(item, root);
else
add(item, root);
}
答案 1 :(得分:1)
正确add
这样的方法:
public void add(int item)
{
root = add(item, root);
}
而不是:
public void add(int item)
{
add(item, root);
}