Java广度优先遍历递归实现
介绍
在Java中,广度优先遍历(BFS)是一种常用的图遍历算法。它通过逐层遍历图的节点,从而实现对图的完整遍历。本文将教会你如何使用递归方法实现Java中的广度优先遍历。
步骤
下面是实现Java广度优先遍历的步骤:
步骤 | 说明 |
---|---|
1 | 创建一个队列,用于存储待访问的节点 |
2 | 将起始节点添加到队列中 |
3 | 创建一个HashSet,用于存储已访问过的节点,将起始节点添加到HashSet中 |
4 | 当队列不为空时,执行以下步骤:<br> 4.1 从队列中取出一个节点<br> 4.2 访问该节点<br> 4.3 将该节点的所有未访问过的邻居节点添加到队列中<br> 4.4 将该节点添加到HashSet中,标记为已访问 |
5 | 重复步骤4直到队列为空 |
代码实现
下面是实现Java广度优先遍历的代码:
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
public class BFSExample {
public void breadthFirstSearch(Node startNode) {
Queue<Node> queue = new LinkedList<>(); // 创建一个队列
HashSet<Node> visited = new HashSet<>(); // 创建一个HashSet
queue.add(startNode); // 将起始节点添加到队列中
visited.add(startNode); // 将起始节点添加到HashSet中
while (!queue.isEmpty()) { // 当队列不为空时
Node currentNode = queue.poll(); // 从队列中取出一个节点
visit(currentNode); // 访问该节点
for (Node neighbor : currentNode.getNeighbors()) { // 遍历该节点的邻居节点
if (!visited.contains(neighbor)) { // 如果邻居节点未被访问过
queue.add(neighbor); // 将邻居节点添加到队列中
visited.add(neighbor); // 将邻居节点添加到HashSet中
}
}
}
}
private void visit(Node node) {
// 对节点进行访问操作,例如打印节点的值
System.out.println(node.getValue());
}
}
上述代码中,我们使用了一个队列来存储待访问的节点,以及一个HashSet来存储已访问过的节点。在每一次循环中,我们从队列中取出一个节点,并访问它。然后,我们将该节点的所有未访问过的邻居节点添加到队列中,并将邻居节点标记为已访问。
示例
下面是一个简单的示例,展示了如何使用上述代码实现广度优先遍历:
public class Main {
public static void main(String[] args) {
Node node1 = new Node("1");
Node node2 = new Node("2");
Node node3 = new Node("3");
Node node4 = new Node("4");
node1.addNeighbor(node2);
node1.addNeighbor(node3);
node2.addNeighbor(node4);
BFSExample bfsExample = new BFSExample();
bfsExample.breadthFirstSearch(node1);
}
}
在上述示例中,我们创建了一个图,其中节点1有两个邻居节点2和3,节点2有一个邻居节点4。然后,我们使用BFSExample类的breadthFirstSearch方法对该图进行广度优先遍历。
旅行图
下面是一个使用mermaid语法表示的广度优先遍历的旅行图:
journey
title Java广度优先遍历递归实现
section 创建队列和HashSet
创建一个队列 -> 创建一个HashSet
section 添加起始节点
将起始节点添加到队列中 -> 将起始节点添加到HashSet中
section 遍历队列
从队列中取出一个节点 -> 访问该节点 -> 将邻居节点添加到队列中 -> 将邻居节点添加到HashSet中
section 重复上述步骤