【问题标题】:Unable to insert more than 1 node in BST in java无法在 java 中的 BST 中插入超过 1 个节点
【发布时间】:2014-06-12 10:18:32
【问题描述】:
class Node<K> {

      public K key;
      public int height;

      public Node<K> left, right, parent;

      public Node(K x, Node<K> l, Node<K> r, Node<K> p) {

        key = x;
        left = l;
        right = r;
        parent = p;
        height = 1;

      }
    }

    public class AVLFrom<K extends Comparable<K>> {

      public Node<K> root;
      // it should be private for software engineering and abstraction purposes
      // but I want to check your tree shapes in my tester, so forgive me

      public AVLFrom() {
        root = null;

      }

      public void insert(K k) {

        root = BSTinsert(k, root, null);


      }

      private Node<K> BSTinsert(K k, Node<K> v, Node<K> parent) {
          if (v == null) {

              return new Node<K>(k, null, null, parent);  
          }
          else {
              int m = k.compareTo(v.key);
              //if k > v, then insert in right subtree
              if (m > 0) {


                 v.right = BSTinsert(k, v.right, v);

              }
              //if k <= v, insert in left subtree
              else {
                  v.left = BSTinsert(k, v.left, v );

              }

            }

          return v;

         }

我正在创建一个 AVL 树,但由于我对 Java 非常不熟悉,所以我只想创建一个普通的 BST 来尝试掌握 Java,然后从那里修改它以使其成为 AVL 树。不幸的是,我无法添加多个节点。

例如,如果我写下面的代码:

AVLFrom<Integer> s = new AVLFrom<Integer>();

        s.insert(5);
        s.insert(10);

代码运行没有任何错误。

那么如果我在insert方法中写下如下代码:

System.out.println(root.key);
System.out.println(root.right.key);

Eclipse 打印值 5,但随后在“root.right.key”部分出现 NullPointerException。

但如果我在 BSTinsert 方法中添加以下代码:

System.out.println(v.key);
System.out.println(v.right.key);

Eclipse 打印 5 和 10。

我不知道为什么会这样,因为如果 v 和 v.right 正确打印 5 和 10,当我返回 v 并将其分配给变量“root”时,尝试时它不应该出现 NullPointerException 错误打印 root.right。我将不胜感激。

在我看来,当在 BSTinsert 方法中返回 v 时,所有“连接”到 BSTinsert 中传递的根节点的节点都不会说已连接/已连接。我不知道为什么会这样。

谢谢!

【问题讨论】:

    标签: java binary-search-tree


    【解决方案1】:

    NPE 出现在第一个 insert 期间,其中 root.right 为空。以下修改将解决此问题。

    System.out.println(root.right != null ? root.right.key : "");
    

    【讨论】:

      【解决方案2】:

      天哪,我只是觉得我意识到了错误。当我在插入函数中插入 5 时,我在插入第二个元素之前打印了 root AND root.right,这就是为什么我不断收到 NullPointerException! -

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 2017-10-21
        • 2017-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        相关资源
        最近更新 更多