我希望不断查看我的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
问题。
你们怎么会这样做?
答案 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检查当前给出的文件是否与上次调用时给出的文件相同。
<强>修订强>
好的,我非常抱歉,我考虑了一下,(在我的回答被提出并被接受之后),我想出了一个更好的解决方案,只涉及搜索第一次出现然后只收集重复。
基于观察结果,一旦找到第一个匹配节点,则所有后续匹配节点将在该节点的左子树或右子树中,但在整个树中没有其他地方。所以:
通过二叉搜索树进行简单搜索,找到第一个匹配的节点。
递归收集该节点的每个子树的所有匹配节点。
这是它的样子。 (请注意,我没有测试过,所以它可能包含很少的错误。)
Consumer<File>