为什么我的BinarySearchTree实现总是将插入的元素报告为重复?

时间:2014-01-10 16:52:12

标签: java tree binary-search-tree

我目前正在与BST合作,我的插入方法存在一些问题,尽管这对我来说似乎很合乎逻辑。调试之后,我发现我使用的变量分配存在问题,比如每次尝试插入节点时,它都会作为根插入,因此打印出来,“不允许重复”。

为此,我分别与4个班级一起工作。以下方法位于BinarySearchTree类中,该类扩展了BinaryTree类。在二叉树类中,我有一个受保护的BinaryTreeNode和树遍历的其他方法。

来自Main的方法调用:

    int value;
    System.out.println("Number of elements to be inserted: ");
    value = input.nextInt();

    for (int i = 0; i < value; i++) {
        System.out.print("Enter next element ");
        num = console.nextInt();
        x.setNum(num);

        tree.insert(x);
    }

问题在于main方法中的方法调用,而不是插入本身。

2 个答案:

答案 0 :(得分:1)

尝试更改

if (temp.info == insertItem)

if (temp.info.equals(insertItem))

if (temp.info.compareTo(insertItem) == 0)

答案 1 :(得分:1)

问题出在几个地方。让我们从您的main()方法开始。

for (int i = 1; i <= numElt; i++) {
    System.out.print("Enter next element ");
    num = input.nextInt();
    x.setNum(num);

    tree.insert(x);
}

当您遍历元素时,您只需更改单个DataElement对象(x)的值。

当您insert这个DataElement对象加入您的BST时,您会创建一个新的BinaryTreeNode,然后设置对此DataElement对象的引用。

BinaryTreeNode node = new BinaryTreeNode();
node.info = insertItem; //Reference set to the object here.

现在,暂时忽略insert方法的其余部分,然后返回循环。在下一次迭代中,您将更改DataElement对象的值。

但是您刚插入的BinaryTreeNode包含对同一DataElement个对象的引用。因此,当您更改新迭代中的值时,最后BinaryTreeNode也会看到更改。

相反,您需要在循环的每次迭代中创建一个新的DataElement,并将其传递给insert()方法。

所以,

for (int i = 1; i <= numElt; i++) {
    x = new DataElement(...); //... means whatever constructor parameters it takes.
    System.out.print("Enter next element ");
    num = input.nextInt();
    x.setNum(num);

    tree.insert(x);
}

这将为每个BinaryTreeNode提供自己的DataElement对象实例。


检测重复项

等等,还有更多。您将重复项定义为具有相同值的对象,而不是相同的引用。所以还有更多的工作要做。

在此处,在insert方法中,检查insertItem是否与最后一个节点的引用相同。

if (temp.info == insertItem) {
    System.out.println("We can't have duplicates!");
    return;
}

如果要按值比较它们,则应使用equals方法:

if (temp.info.equals(insertItem))

这应该按值而非参考来检查它们。