为什么图的广度优先搜索错误
Why wrong with the breadth first search of graph
public static void BFS(TTNode node){
Set<TTNode> accessedNodes = new HashSet<TTNode>();
Queue<TTNode> queue = new LinkedList<TTNode>();
queue.offer(node);
while (!queue.isEmpty()){
TTNode accessingNode = queue.poll();
System.out.println(accessingNode.payload);
accessedNodes.add(accessingNode);
for (TTNode child : accessingNode.children){
if (!accessedNodes.contains(child)){
queue.offer(child);
}
}
}
}
为什么结果是:1 2 3 4 5 5 5,5出现了3次?
你的代码的问题是你应该标记一个刚刚访问过的节点
将其推入队列。假设我们有一个包含三个节点 1 到 3 的图。还有边
是(1-2),(1-3),(3-2)。现在你先按 say 1,根据你的代码,你弹出 1 将其标记为已访问并按 2 和 3(按此顺序说)。现在弹出 2 并将其标记为已访问。现在在 2 的邻居中,3 仍然标记为未访问,因此您再次推送它。所以节点 3 在 bfs 的队列中多次结束。我不知道您用什么语言编写了代码,但我已经进行了更改希望语法正确
public static void BFS(TTNode node){
Set<TTNode> accessedNodes = new HashSet<TTNode>();
Queue<TTNode> queue = new LinkedList<TTNode>();
queue.offer(node);
accessedNodes.add(node);
while (!queue.isEmpty()){
TTNode accessingNode = queue.poll();
System.out.println(accessingNode.payload);
for (TTNode child : accessingNode.children){
if (!accessedNodes.contains(child)){
accessedNodes.add(child);
queue.offer(child);
}
}
}
}
如果我在代码中犯了错误或者您仍然有疑问,请发表评论。
public static void BFS(TTNode node){
Set<TTNode> accessedNodes = new HashSet<TTNode>();
Queue<TTNode> queue = new LinkedList<TTNode>();
queue.offer(node);
while (!queue.isEmpty()){
TTNode accessingNode = queue.poll();
System.out.println(accessingNode.payload);
accessedNodes.add(accessingNode);
for (TTNode child : accessingNode.children){
if (!accessedNodes.contains(child)){
queue.offer(child);
}
}
}
}
为什么结果是:1 2 3 4 5 5 5,5出现了3次?
你的代码的问题是你应该标记一个刚刚访问过的节点 将其推入队列。假设我们有一个包含三个节点 1 到 3 的图。还有边 是(1-2),(1-3),(3-2)。现在你先按 say 1,根据你的代码,你弹出 1 将其标记为已访问并按 2 和 3(按此顺序说)。现在弹出 2 并将其标记为已访问。现在在 2 的邻居中,3 仍然标记为未访问,因此您再次推送它。所以节点 3 在 bfs 的队列中多次结束。我不知道您用什么语言编写了代码,但我已经进行了更改希望语法正确
public static void BFS(TTNode node){
Set<TTNode> accessedNodes = new HashSet<TTNode>();
Queue<TTNode> queue = new LinkedList<TTNode>();
queue.offer(node);
accessedNodes.add(node);
while (!queue.isEmpty()){
TTNode accessingNode = queue.poll();
System.out.println(accessingNode.payload);
for (TTNode child : accessingNode.children){
if (!accessedNodes.contains(child)){
accessedNodes.add(child);
queue.offer(child);
}
}
}
}
如果我在代码中犯了错误或者您仍然有疑问,请发表评论。