Graph 为什么图形的广度优先搜索错误 publicstaticvoidbfs(TTNode){ Set accessedNodes=new HashSet(); Queue Queue=new LinkedList(); queue.offer(节点); 而(!queue.isEmpty()){ TTNode accessingNode=queue.poll(); System.out.println(accessingNode.payload); accessedNodes.add(accessingNode); for(TTNode子节点:accessingNode.children){ 如果(!accessedNodes.contains(子)){ 排队。提供(儿童); } } } }

Graph 为什么图形的广度优先搜索错误 publicstaticvoidbfs(TTNode){ Set accessedNodes=new HashSet(); Queue Queue=new LinkedList(); queue.offer(节点); 而(!queue.isEmpty()){ TTNode accessingNode=queue.poll(); System.out.println(accessingNode.payload); accessedNodes.add(accessingNode); for(TTNode子节点:accessingNode.children){ 如果(!accessedNodes.contains(子)){ 排队。提供(儿童); } } } },graph,Graph,为什么结果是:1 2 3 4 5 5 5,5显示三次?代码的问题是,您应该在访问之前标记一个节点 把它推到队列里。假设我们有一个有三个节点1到3的图。边缘呢 分别为(1-2)、(1-3)、(3-2)。现在你先按1键,根据你的代码弹出1键,将其标记为已访问,然后按2键和3键(按此顺序)。现在您弹出2并标记它已访问。现在在2的邻居中,3仍然被标记为未访问,所以你再次推它。因此,节点3多次在bfs的队列中结束。我不知道您用什么语言编写代码,但我已经做了更改,希望语法是正确的 public static

为什么结果是:1 2 3 4 5 5 5,5显示三次?

代码的问题是,您应该在访问之前标记一个节点 把它推到队列里。假设我们有一个有三个节点1到3的图。边缘呢 分别为(1-2)、(1-3)、(3-2)。现在你先按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);
    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);
            }
        }
    }
}
publicstaticvoidbfs(TTNode){
Set accessedNodes=new HashSet();
Queue Queue=new LinkedList();
queue.offer(节点);
accessedNodes.add(节点);
而(!queue.isEmpty()){
TTNode accessingNode=queue.poll();
System.out.println(accessingNode.payload);
for(TTNode子节点:accessingNode.children){
如果(!accessedNodes.contains(子)){
添加(子节点);
排队。提供(儿童);
}
}
}
}
如果我在代码中犯了错误或者您仍然有疑问,请发表评论

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);
            }
        }
    }
  }