请在下面找到我对DFS的实施。
protected void DFS(String search) {
for(Tree<T> child : leafs) {
if(child.value.equals(search))
return;
else
child.DFS(search);
System.out.println(child.value);
}
}
目标是在找到其值在变量搜索中的节点时停止遍历。但是,上面的函数继续遍历树,甚至超出声明的搜索节点。有人可以帮我修改上面的功能吗?
谢谢。
编辑1
protected boolean DFS(String anaphorKey) {
boolean found = false;
for(Tree<T> child : leafs) {
if(child.head.equals(anaphorKey))
return true;
found = child.DFS(anaphorKey);
if(found == true)
break;
System.out.println(child.head);
//System.out.println("anaphorKey: "+anaphorKey);
}
return found;
}
尝试实施给定的答案建议(@ SJuan76)。上面的实现没有按预期工作。你能指点一下代码不符合逻辑建议的地方吗?
答案 0 :(得分:3)
菜鸟,我可以建议使用经典的for循环实现(与现在使用的增强型for循环相反),这样可以更好地集成你的停止条件,例如:
protected boolean DFS(String key) {
boolean found = false;
for(int i = 0; i < leafs.size() && !found; i++) {
Tree<T> child = leafs.get(i);
if(child.head.equals(key))
found = true;
else
found = child.DFS(key);
}
return found;
}
因此,一旦找到您发现的条件,'found'就会变为true并且您的循环停止。
您可能忘记的是递归的“found = child.DFS(key)”部分,您需要记住递归调用的结果,因此链上的所有for循环都会尽快中断当你回来。
希望有所帮助。
答案 1 :(得分:1)
选项A(Nice):该函数返回一个值,当找到该节点时,它返回一个不同的值,如果找不到该节点。当您调用方法时,如果获得found
值,则停止循环并返回found
值。
选项B(丑陋):找到后,会产生异常(如果是你自己的实现,则会更好)。别忘了抓住它。
选项C(Uglier):与全局(静态)变量相同。
更新1:
看起来您的方法现在应该运行正常,您是否可以检查(System.out.println
)是否找到了您的价值?
在个人看来,我会找到
protected boolean DFS(String anaphorKey) {
for(Tree<T> child : leafs) {
if(child.head.equals(anaphorKey))
return true;
if(child.DFS(anaphorKey)) // No need to store value. No need to check == true (it is implicit)
return true; // If we are in this line the value was found, always return true
System.out.println(child.head);
//System.out.println("anaphorKey: "+anaphorKey);
}
return false; // If the method did not exit previously it was because the value was not found, so in this line always return false
}
更具可读性(但它应该与您的实现完全一致)