DFS树遍历功能修改

时间:2012-03-07 23:33:57

标签: java tree traversal depth-first-search

请在下面找到我对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)。上面的实现没有按预期工作。你能指点一下代码不符合逻辑建议的地方吗?

2 个答案:

答案 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
} 

更具可读性(但它应该与您的实现完全一致)