将广度优先搜索转换为深度优先搜索Java

时间:2011-10-13 19:34:31

标签: java algorithm search depth

自从我接触Java以来​​已经很长时间了,所以这似乎是一个奇怪的问题。目前我在StackOverflow上找到了这个广度优先搜索代码,我在最后修改了它,但我会在这里发布原始代码。

public List<Node> getDirections(Node start, Node finish){
    List<Node> directions = new LinkedList<Node>();
    Queue<Node> q = new LinkedList<Node>();
    Node current = start;
    q.add(current);
    while(!q.isEmpty()){
        current = q.remove();
        directions.add(current);
        if (current.equals(finish)){
            break;
        }else{
            for(Node node : current.getOutNodes()){
                if(!q.contains(node)){
                        q.add(node);
                }
            }
        }
    }
    if (!current.equals(finish)){
        System.out.println("can't reach destination");
}
return directions;
}

我知道其他深度优先搜索算法,但我也被告知可以轻松地将广度优先搜索转换为深度优先搜索,如果对此代码执行而不是2,我会更好地理解它完全不同的代码。

如何将其更改为深度优先搜索?

4 个答案:

答案 0 :(得分:5)

Depth first和Breadth拳头之间的主要区别在于您探索“前沿”(您尚未探索的节点列表)中的节点的顺序。

如果将当前节点的传出节点添加到该列表的末尾,您将在“级别”中测试所有可能性(出于简化目的,将其想象为树),然后再进入下一级别,所以你有一个广度优先搜索。

另一方面,如果您在之前添加的节点(属于树的“上层”)之前探索新添加的节点(当前位置的传出节点),那么您我将首先探索树的深度。

就数据结构而言,您需要一个堆栈而不是一个队列,但我认为这个解释可能会派上用场。

答案 1 :(得分:2)

您必须将q.add(node)(在列表末尾添加)替换为q.add(0, node)(在开头添加)。基本上,使用stack代替queue

显然,您必须使用List界面而不是Queue界面才能访问LinkedList

答案 2 :(得分:1)

Deque<Node> q = new LinkedList<Node>();

并使用poppush代替removeadd

基本上从你添加的同一侧移除(普通removeadd是LIFO队列基础操作)深度优先使用FIFO堆栈

和其他搜索算法基本相同,但使用不同类型的队列(例如,急切搜索使用最简单的下一步)

答案 3 :(得分:0)

QueueLinkedList替换为Stackadd替换为push,将remove替换为pop