深度优先搜索(DFS)模板

深度优先搜索(DFS)是一种常用的图搜索算法,用于遍历或搜索图或树的节点。在DFS中,我们从起始节点开始,沿着一条路径不断向下搜索,直到到达叶子节点,然后返回上一层继续搜索。DFS通常使用递归或栈来实现。

DFS算法模板

以下是DFS的基本模板,我们可以根据具体问题进行适当的修改和扩展。

// DFS模板
void dfs(Node node) {
    // 终止条件
    if (node == null) {
        return;
    }
    
    // 处理当前节点
    // do something with the current node
    
    // 递归遍历相邻节点
    for (Node neighbor : node.neighbors) {
        if (!visited.contains(neighbor)) {
            visited.add(neighbor);
            dfs(neighbor);
        }
    }
}

在上面的代码中,我们定义了一个dfs函数,接受一个节点作为参数。我们首先检查终止条件,如果当前节点为空,则直接返回。然后处理当前节点,接着遍历当前节点的相邻节点,如果相邻节点未被访问过,则递归调用dfs函数继续遍历。

应用场景

DFS常用于解决以下问题:

  • 图的遍历和连通性问题
  • 树的遍历和搜索
  • 拓扑排序
  • 回溯算法

示例

让我们以一个简单的示例来说明DFS的应用。假设有一个无向图如下所示:

erDiagram
    A -- B
    A -- C
    B -- D
    C -- E
    D -- F

我们从节点A开始进行DFS遍历,按照深度优先的顺序遍历整个图。我们可以使用以下代码来实现DFS:

class Node {
    int val;
    List<Node> neighbors;
    
    public Node(int val) {
        this.val = val;
        this.neighbors = new ArrayList<>();
    }
}

Set<Node> visited = new HashSet<>();

void dfs(Node node) {
    if (node == null || visited.contains(node)) {
        return;
    }
    
    System.out.println(node.val);
    visited.add(node);
    
    for (Node neighbor : node.neighbors) {
        dfs(neighbor);
    }
}

// 构建图
Node A = new Node(1);
Node B = new Node(2);
Node C = new Node(3);
Node D = new Node(4);
Node E = new Node(5);
Node F = new Node(6);

A.neighbors.add(B);
A.neighbors.add(C);
B.neighbors.add(D);
C.neighbors.add(E);
D.neighbors.add(F);

// 从节点A开始DFS遍历
dfs(A);

通过以上代码,我们可以得到以下输出结果:

1
2
4
6
3
5

结语

深度优先搜索是一种常用的图搜索算法,可以解决许多与图相关的问题。通过递归或栈的方式实现DFS,我们可以按照深度优先的顺序遍历整个图或树。希望本文对你理解DFS算法有所帮助。