检查BinarySearchTree中的重复值

时间:2015-12-14 02:38:52

标签: java

我希望不断查看我的BinarySearchTree,以防File f有重复值,而不是在找到File f的第一个实例后结束。我需要返回File f的所有实例。

现在这是我找到File

的代码
public File locateHelper(File f, Node<File> node) {
    if (node == null) {
        return null;
    }

    int result = f.compareTo(node.data);
    if (result == 0) {
        return f;
    }
    if (result < 0) {
        return locateHelper(f, node.leftChild);
    }

    return locateHelper(f, node.rightChild);

}

我一直在尝试将其切换为可能返回ArrayList<File>而不是单个文件,但我一直遇到NullPointerException问题。

你们怎么会这样做?

1 个答案:

答案 0 :(得分:2)

我会用这样的东西解决它:

public ArrayList<File> collectTree( Node<File> root )
{
    List<File> files = new ArrayList<>();
    collectTree( root, files );
    return files;
}

private void collectTree( Node<File> node, ArrayList<File> files )
{
    if( node == null )
        return;
    collectTree( node.leftChild, files );
    files.add( node.data );
    collectTree( node.rightChild, files );
}

这将返回ArrayList<File>中整个树的内容。

然后,找到重复项是走树和检查相邻元素的简单问题。

你可以通过使用访问者模式(查找它)来收集ArrayList内的整个树,而不是收集列表中的节点,你可以调用一些{{1检查当前给出的文件是否与上次调用时给出的文件相同。

<强>修订

好的,我非常抱歉,我考虑了一下,(在我的回答被提出并被接受之后),我想出了一个更好的解决方案,只涉及搜索第一次出现然后只收集重复。

基于观察结果,一旦找到第一个匹配节点,则所有后续匹配节点将在该节点的左子树或右子树中,但在整个树中没有其他地方。所以:

  1. 通过二叉搜索树进行简单搜索,找到第一个匹配的节点。

  2. 递归收集该节点的每个子树的所有匹配节点。

  3. 这是它的样子。 (请注意,我没有测试过,所以它可能包含很少的错误。)

    Consumer<File>