如何在 Java 中创建二叉搜索树?

How Do I Create A Binary Search Tree In Java?

提问人:charlievans 提问时间:11/16/2023 最后编辑:charlievans 更新时间:11/16/2023 访问量:45

问:

我正在 OOP 课堂上做家庭作业,但很难看出我哪里出了问题。即使我没有对任何让我感到困惑的节点做任何事情,我也不断收到 NullPointerExceptions。 我正在尝试创建一个 insert 方法,该方法采用通用对象参数并且不返回任何内容 - 这就是我目前所拥有的:

public class BinarySearchTree<T extends Comparable <T>> implements BinaryTree<T> {
    class Node {
       public T data;
       public Node left;
       public Node right;
       
       public Node(T newObject) {
          this.data = newObject;
          this.left = null;
          this.right = null;
       }
       
       public void insert(T newObject) {
          if (root == null) {
             root = new Node(newObject);
          } else if (newObject.compareTo(root.data) < 0) {
             root.left.insert(newObject);
          } else if (newObject.compareTo(root.data) > 0) {
             root.right.insert(newObject);
          }
       }
    }
    
    private Node root;
    
    public void insert(T newObject) {
       this.insert(newObject);
    }
}

但是,通过运行以下命令,我不断被抛出 NullPointerExceptions:bstExample.insert(5);

我看了一堆 YouTube 视频,重读了我关于二叉树(搜索)树的教科书部分,并向同学寻求支持,但没有想出任何东西。

Java binary-search-tree 节点

评论

3赞 John3136 11/16/2023
异常加载了更多信息 - 例如问题的行号。你应该看看它,如果你仍然需要帮助,你应该在你的问题中包括所有这些。
0赞 lugiorgi 11/16/2023
请编辑问题,将其限制为具有足够详细信息的特定问题,以确定适当的答案。
0赞 Old Dog Programmer 11/16/2023
您是否搜索过 Stack Overflow?stackoverflow.com/questions/218384/......请注意,某些响应包含有关使用堆栈跟踪的信息。这是一个专门关于读取堆栈跟踪的问题。

答:

0赞 Unmitigated 11/16/2023 #1

作为 的实例方法,插入到空树中存在问题,就像这样,您不能调用任何方法。同样,调用在 是 时不起作用。您需要构建新的第一个以设置为 .insertNodethis.rootnullnullroot.left.insert(newObject);root.leftnullNoderoot.left

在类本身中实现帮助程序方法要简单得多。insertBinarySearchTree

public void insert(T newObject) {
   this.root = insert(this.root, newObject);
}

private Node insert(Node curr, T obj) {
    if (curr == null)
        return new Node(obj);
    else {
        final int comp = obj.compareTo(curr.data);
        if (comp < 0)
            curr.left = insert(curr.left, obj);
        else if (comp > 0) 
            curr.right = insert(curr.right, obj);
        return curr;
    }
}