Java中的BST实现

时间:2016-01-05 03:30:15

标签: java binary-search-tree

这是我在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默认构造函数不起作用?

2 个答案:

答案 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);
}