DFS和BFS
在计算机科学中,深度优先搜索(DFS)和广度优先搜索(BFS)是在树或图中遍历或搜索节点的两种主要算法。以下是使用Java语言实现DFS和BFS的示例代码。
深度优先搜索(DFS)
DFS算法是一种用于遍历或搜索树或图的边缘的算法。在这个过程中,我们从一个选择的节点开始,探索尽可能深的分支,直到到达一个没有未探索邻居的节点,然后回溯。
为了实现DFS,我们可以使用递归方法,或者使用栈来模拟递归过程。
使用递归实现DFS
import java.util.*;
public class Graph {
private Map<Integer, List<Integer>> adjList = new HashMap<>();
// 添加边缘
public void addEdge(int source, int dest) {
adjList.computeIfAbsent(source, k -> new ArrayList<>()).add(dest);
adjList.computeIfAbsent(dest, k -> new ArrayList<>()).add(source); // 对于无向图添加此行
}
// 深度优先搜索
public void dfs(int start) {
Set<Integer> visited = new HashSet<>();
dfsRecursive(start, visited);
}
private void dfsRecursive(int current, Set<Integer> visited) {
visited.add(current);
System.out.println(current + " ");
for (int dest : adjList.getOrDefault(current, Collections.emptyList())) {
if (!visited.contains(dest)) {
dfsRecursive(dest, visited);
}
}
}
public static void main(String[] args) {
Graph graph = new Graph();
// 假设添加了一些边缘
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 2);
graph.addEdge(2, 0);
graph.addEdge(2, 3);
graph.addEdge(3, 3);
System.out.println("深度优先遍历:");
graph.dfs(2); // 从节点2开始DFS
}
}
广度优先搜索(BFS)
BFS算法是一种用于遍历或搜索树或图的边缘的算法。它从一个选择的节点开始,然后探索所有邻居节点,然后是邻居的邻居,依此类推。
为了实现BFS,我们通常使用队列。
import java.util.*;
public class Graph {
private Map<Integer, List<Integer>> adjList = new HashMap<>();
// 添加边缘
public void addEdge(int source, int dest) {
adjList.computeIfAbsent(source, k -> new ArrayList<>()).add(dest);
adjList.computeIfAbsent(dest, k -> new ArrayList<>()).add(source); // 对于无向图添加此行
}
// 广度优先搜索
public void bfs(int start) {
Set<Integer> visited = new HashSet<>();
Queue<Integer> queue = new LinkedList<>();
visited.add(start);
queue.add(start);
while (!queue.isEmpty()) {
int current = queue.poll();
System.out.println(current + " ");
for (int dest : adjList.getOrDefault(current, Collections.emptyList())) {
if (!visited.contains(dest)) {
visited.add(dest);
queue.add(dest);
}
}
}
}
public static void main(String[] args) {
Graph graph = new Graph();
// 假设添加了一些边缘
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 2);
graph.addEdge(2, 0);
graph.addEdge(2, 3);
graph.addEdge(3, 3);
System.out.println("广度优先遍历:");
graph.bfs(2); // 从节点2开始BFS
}
}
这些示例假设图是无向的,并且图的结构是通过邻接表来表示的。对于有向图,你只需要在addEdge方法中添加一条边,而不是两条。这些代码示例提供了DFS和BFS算法的基本实现框架,可以根据具体需求进行修改和扩展。

浙公网安备 33010602011771号