0

BST の再帰的な挿入方法に取り組んでいます。この関数は、再帰的なヘルパー メソッドであると想定され、Node.js というプライベート クラスにあります。Node クラスは、ルートのインスタンス変数を含む BinarySearchTree というクラスにあります。要素を挿入しようとすると、次の場所で NullPointerException が発生します。

this.left = insert(((Node)left).element);

なぜこれが起こるのかわかりません。私の理解が正しければ、BST では、横断した経路の最後の場所にアイテムを挿入することになっています。どんな助けでも大歓迎です!

private class Node implements BinaryNode<E>
{
    E item;
    BinaryNode<E> left, right;

   public BinaryNode<E> insert(E item)
   {
       int compare = item.compareTo(((Node)root).item);

       if(root == null)
       {
           root = new Node();
           ((Node)root).item = item;
       }
       else if(compare < 0)
       {
           this.left = insert(((Node)left).item);
       }
       else if(compare > 0)
       {
           this.right = insert(((Node)right).item);
       }

        return root;
     }
}
4

2 に答える 2

0

Coz ur left は null ですか? これじゃないはず.left = insert(item)

しかし、コードには他の問題もあります。私はあなたが見つけるためにそれを残しておきます.

于 2012-10-24T04:48:20.497 に答える
0

これは、挿入が成功する直前に、null オブジェクトからパラメーターを読み取っているためです。また、あなたの左と右は両方ともヌルなので、それはあなたに任せますが、考えてみてください。new Node(item)代わりに挿入する必要があります。また、関数が再帰的である場合は、現在のparentNode (ルート) の参照を渡す必要があります。これがあなたのやり方を理解するためのスケルトンです。コードを理解していただければ幸いです。

   private Node<Item> insert(Node traversedNode, Item item)
   {
     if(traversedNode == null)
     {
         // make your life easier and pass item in a constructor
         return new Node(item);
     }
     // Do this iff traversedNode != null, which it is in this block
     int compare = item.compareTo(traversedNode.item);
        ... 
     // Now you check to see if compare < 0 and compare > 0
     // then you insert your node accordingly and recursively
     // you need to pass the current node left or right as your new traversedNode
     // eg. traversedNode.left = insert( traversedNode.left, item )
   }
于 2012-10-24T04:51:27.610 に答える