我已经很久没有接触过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;
}
我知道其他的深度优先搜索算法,但也有人告诉我,它可以很容易地将广度优先搜索转换为深度优先搜索,如果对这段代码进行搜索,而不是对两个完全不同的代码进行搜索,我会更好地理解它。
如何将此更改为深度优先搜索?
最佳答案
深度优先和广度优先的主要区别在于,您在“边界”中探索节点的顺序(您尚未探索的节点列表)。
如果将当前节点的传出节点添加到该列表的末尾,那么在进入下一个级别之前,您将在“级别”(为了简化起见,将其想象为树)中测试所有可能的节点,这样您就有了广度优先搜索。
另一方面,如果在前面添加的节点(属于树的“上部”级别)之前探索新添加的节点(来自当前位置的传出节点),则将首先探索树的深度。
在数据结构方面,您需要一个堆栈而不是队列,但我认为这个解释可能很有用。