Java 中的 BST 实施

BST implementation in Java

这是我在 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 参数化构造函数时,一切都按预期工作。但是,如果我不使用默认构造函数,根将继续保留 null 并且不会添加任何内容。似乎无法理解为什么会这样。调试器在 add 帮助程序调用中给出了 null pointer exception。但是如果 null root 是调用者,那么我的 add 的定义方式就不应该有任何例外。我的问题是为什么带有默认构造函数的 BST 不起作用?

在这种方法中 private Node add(int item, Node p ) 您将返回 ppublic 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);
    }

像这样更正 add 方法:

public void add(int item)
{
    root = add(item, root);
}

而不是这个:

public void add(int item)
{
    add(item, root);
}