无法在Java中的BST中插入多个节点

时间:2014-06-11 23:53:49

标签: java binary-search-tree

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);

代码运行没有任何错误。

然后,如果我在插入方法中写下以下代码:

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

Eclipse打印值5但是我在&#34; root.right.key&#34;得到了NullPointerException。一部分。

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

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

Eclipse打印5和10。

我不知道为什么会发生这种情况,因为如果v和v.right正确打印5和10,当我返回v并将其分配给变量&#34; root&#34;时,它不应该尝试打印root.right时出现NullPointerException错误。我将不胜感激任何帮助。

在我看来,所有获得连接的节点都是&#34;对于在BSTinsert中传递的根节点,在BSTinsert方法中返回v时,不要说连接/连接。我不知道为什么会这样。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

NPE出现在insert root.right为空的System.out.println(root.right != null ? root.right.key : ""); 期间。以下修改将解决问题。

{{1}}