【问题标题】:Insertion into BST without header Node JAVA插入 BST 没有头节点 JAVA
【发布时间】:2012-10-14 03:14:53
【问题描述】:

我正在研究 BST 的递归插入方法。这个函数被认为是一个递归辅助方法,并且位于一个名为 Node 的私有类中。 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;
     }
}

【问题讨论】:

    标签: java binary-search-tree


    【解决方案1】:

    因为你的左边是空的? 不应该是 this.left = insert(item)

    但代码中还有其他问题。我会把它留给你找出来。

    【讨论】:

    • 当我在 if 语句中检查 null 时(即 if(left == null) )我创建了一个新节点。但是,问题仍然存在。
    【解决方案2】:

    这是因为您在成功插入之前正在从空对象读取参数。你的左右都是空的,所以我会把它留给你弄清楚,但考虑一下。您应该插入 new Node(item) 代替。如果您的函数是递归的,那么您需要传入当前父节点(根)的引用。这是一个让你上路的框架,希望你能理解代码。

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

    【讨论】:

    • 如果我理解正确,我会检查横向方向(进行比较)如果根不为空,然后获取当前 parentNode 并进行项目比较。 >如果比较小于0,如果项目为空,则创建一个新节点,否则调用插入
    • 我编辑了代码,以便更清楚地说明步骤顺序。当然,您会看到您的方法签名必须更改,并且第一次调用您将传入(root, item) 作为参数的方法。
    猜你喜欢
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多