Java 调试BFS树travesal算法
我独自一人在做这个项目,可以用另一双眼睛来观察这个项目,看看我做错了什么。第一个循环无限运行Java 调试BFS树travesal算法,java,graph,breadth-first-search,Java,Graph,Breadth First Search,我独自一人在做这个项目,可以用另一双眼睛来观察这个项目,看看我做错了什么。第一个循环无限运行 public void bfs(String start) { //Initial Case add_queue.add(start); graph.visit(start); Iterator<String> neighbors; String neighbor; while(
public void bfs(String start)
{
//Initial Case
add_queue.add(start);
graph.visit(start);
Iterator<String> neighbors;
String neighbor;
while(!add_queue.empty())
{
neighbors = graph.neighbors(start);
neighbor = neighbors.next();
graph.visit(neighbor);
add_queue.add(neighbor);
while(neighbors.hasNext())
{
neighbor = neighbors.next();
if(!graph.isVisited(neighbor)) //If vertex is not visited it is new and is added to the queue
{
add_queue.add(neighbor);
graph.visit(neighbor);
}
}
start = add_queue.remove();
remove_queue.add(start); //transfers vertex from add_queue to remove queue so that the order that the vertices were traversed is stored in memory
}
}
public void bfs(字符串开始)
{
//初始案例
添加队列。添加(开始);
访问(开始);
迭代器邻居;
串邻居;
而(!add_queue.empty())
{
邻居=图形。邻居(开始);
邻居=邻居。下一步();
访问(邻居);
添加队列。添加(邻居);
while(neights.hasNext())
{
邻居=邻居。下一步();
if(!graph.isvisted(neighbor))//如果未访问顶点,则该顶点是新的,并添加到队列中
{
添加队列。添加(邻居);
访问(邻居);
}
}
start=add_queue.remove();
remove_queue.add(start);//将顶点从add_queue传输到remove queue,以便顶点的遍历顺序存储在内存中
}
}
添加队列的定义是什么
这可能是一个不好的命名问题,但听起来像是empty()
做了一些事情,而不仅仅是检查它是否为空(这可能被称为isEmpty()
)
此外,看起来您总是在每个外部循环中添加至少1个添加队列(就在内部while之前),但每次迭代只从添加队列中删除一项。什么是
add\u queue
对empty()
的定义
这可能是一个不好的命名问题,但听起来像是empty()
做了一些事情,而不仅仅是检查它是否为空(这可能被称为isEmpty()
)
此外,看起来您总是在每个外部循环中添加至少1个添加队列(在内部while之前),但每次迭代仅从添加队列中删除一个项目。我认为您添加的是邻居的第一个顶点,而没有检查它是否已被访问。。在这里:
neighbor = neighbors.next(); <- you get first
graph.visit(neighbor); <- you visit
add_queue.add(neighbor); <- you add it without any check
while(neighbors.hasNext())
{
neighbor = neighbors.next();
if(!graph.isVisited(neighbor)) <- you do check for the others
{
add_queue.add(neighbor);
graph.visit(neighbor);
}
}
neighbor=neighbors.next() 我认为您正在添加邻居的第一个顶点,而没有检查它是否已被访问。。在这里:
neighbor = neighbors.next(); <- you get first
graph.visit(neighbor); <- you visit
add_queue.add(neighbor); <- you add it without any check
while(neighbors.hasNext())
{
neighbor = neighbors.next();
if(!graph.isVisited(neighbor)) <- you do check for the others
{
add_queue.add(neighbor);
graph.visit(neighbor);
}
}
neighbor=neighbors.next() 需要调查的几个地方:
检查以确保graph.isvisit()
确实能够识别何时通过graph.visit()访问了节点
graph.neighbor(start)
是否真正返回start的邻居?不包括在这个列表中的开始
需要调查的几个地方:
检查以确保graph.isvisit()
确实能够识别何时通过graph.visit()访问了节点
graph.neighbor(start)
是否真正返回start的邻居?不包括在这个列表中的开始
你的代码有点不清楚。graph.neights
返回的是什么
通常,要执行BFS,您需要将当前节点的子节点添加到队列中,而不是它的邻居。因为它都进入一个队列,这将确保您以正确的顺序访问树中的每个节点。假设它是一个树而不是一个普通图,这也将确保您不会多次访问一个节点,从而允许您删除对isvisted
的检查
因此,从队列中取出下一个节点,将其所有子节点添加到队列中,访问该节点,然后重复,直到队列为空。您的代码有点不清楚。graph.neights
返回的是什么
通常,要执行BFS,您需要将当前节点的子节点添加到队列中,而不是它的邻居。因为它都进入一个队列,这将确保您以正确的顺序访问树中的每个节点。假设它是一个树而不是一个普通图,这也将确保您不会多次访问一个节点,从而允许您删除对isvisted
的检查
因此,从队列中取出下一个节点,将其所有子节点添加到队列中,访问该节点,然后重复,直到队列为空。Donnie,graph.Neights(string)为指定顶点的邻居返回迭代器。很抱歉,这是一张图表。“树遍历”对我来说是错误的。Donnie,graph.Neights(字符串)为指定顶点的邻居返回一个迭代器。很抱歉,这是一张图表。“树遍历”对我来说是错误的。我想杰克的建议解决了这个问题。堆栈上始终至少有一个顶点。在第一个循环开始时,我取出了neights.next()赋值行,以及add和visit行,结果成功了。谢谢你及时有效的帮助。我想杰克的建议解决了这个问题。堆栈上始终至少有一个顶点。在第一个循环开始时,我取出了neights.next()赋值行,以及add和visit行,结果成功了。感谢所有及时有效的帮助。