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,我会更好地理解它完全不同的代码。
如何将其更改为深度优先搜索?
答案 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>();
并使用pop
和push
代替remove
和add
基本上从你添加的同一侧移除(普通remove
和add
是LIFO队列基础操作)深度优先使用FIFO堆栈
和其他搜索算法基本相同,但使用不同类型的队列(例如,急切搜索使用最简单的下一步)
答案 3 :(得分:0)
将Queue
和LinkedList
替换为Stack
,add
替换为push
,将remove
替换为pop