Java 深度优先搜索/广度优先搜索易于实现 List unvisited=node.getChildren();
DFS:Java 深度优先搜索/广度优先搜索易于实现 List unvisited=node.getChildren();,java,depth-first-search,breadth-first-search,Java,Depth First Search,Breadth First Search,DFS: while(!unvisited.isEmpty()){ 树节点=未访问。删除(0); //搜索节点 unvisited.addAll(0,node.getChildren()); } BFS: while(!unvisited.isEmpty()){ 树节点=未访问。删除(0); //搜索节点 unvisited.addAll(node.getChildren()); } 这些实现是否过于简单而不真实?想知道我是不是遗漏了什么 这些实现是否过于简单而不真实?我想知道我是不是 遗漏
while(!unvisited.isEmpty()){
树节点=未访问。删除(0);
//搜索节点
unvisited.addAll(0,node.getChildren());
}
BFS:
while(!unvisited.isEmpty()){
树节点=未访问。删除(0);
//搜索节点
unvisited.addAll(node.getChildren());
}
这些实现是否过于简单而不真实?想知道我是不是遗漏了什么
这些实现是否过于简单而不真实?我想知道我是不是
遗漏了什么
您的实现是正确的。除非仅限于非循环图,否则您将在未访问列表中得到重复的节点,因为您没有标记已访问的节点。在添加到树之前,您需要迭代子项列表并标记它们已访问 BFS伪代码:
也可以考虑使用DEQE代替列表。请参阅:
@jlordo抱歉,我错过了上面的声明。别理我!是的,上述实现仅适用于非循环图。然而,您的回答也揭示了扩展到循环图所需的修改。谢谢List<Tree<T>> unvisited = node.getChildren();
while (!unvisited.isEmpty()) {
Tree<T> node = unvisited.remove(0);
//search node
unvisited.addAll(0, node.getChildren());
}
while (!unvisited.isEmpty()) {
Tree<T> node = unvisited.remove(0);
//search node
unvisited.addAll(node.getChildren());
}