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号
浙公网安备 33010602011771号