2012-10-24 69 views
0

我正在为BST的递归插入方法。假设这个函数是一个递归辅助方法,并且在一个名为Node的私有类中。 Node类位于一个名为BinarySearchTree的类中,该类包含一个根实例变量。 当我试图插入一个元素,我在得到一个NullPointerException:插入BST无头节点JAVA

this.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; 
    } 
} 

回答

0

Coz ur left is null? 不应该是this.left =插入(item)

但是在代码中还存在其他问题。我会留下这个给你看看。

+0

当我检查我的if语句中的null(即if(left == null))时,我创建了一个新节点。但是,问题依然存在。 – Petiatil

0

这是因为您在插入成功之前正在从空对象读取参数。而且你的左右两边都是空的,所以我会留给你弄清楚,但想一想。您应该插入new Node(item)。如果你的函数是递归的,那么你需要传入当前parentNode(root)的引用。这里有一个框架可以帮助你解决问题,希望你能理解代码。

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) 
    } 
+0

如果我理解正确,我检查横向的方向(做比较)iff root不为null,然后取当前parentNode并进行项目比较。 >如果比较小于0 如果项目为空 然后创建一个新节点 否则调用插入 – Petiatil

+0

我编辑了代码以使它更清楚步骤的顺序应该是什么。当然,你会看到你的方法签名必须改变,并且你第一次调用你在'(root,item)'中传递的方法作为参数。 – KappaMax