请详细解释深度优先搜索（DFS）的基本概念和应用，并在回答中包括以下内容：深度优先搜索的定义、工作原理、与广度优先搜索（BFS）的区别、在树和图上的应用、以及一个简单的代码示例。
user
深度优先搜索（DFS）是一种用于遍历或搜索树或图数据结构的算法。它从根节点（对于图的情况，可以选择任意节点作为根节点）开始，沿着一条路径尽可能深地探索，直到不能继续为止，然后回溯到上一个节点，继续探索未访问的路径，直到所有节点都被访问过。

DFS的工作原理如下：
1. 选择起始节点并标记为已访问。
2. 探索从该节点出发的所有未访问的相邻节点。
3. 对每一个相邻节点，重复步骤1和2。
4. 如果当前节点没有未访问的相邻节点，回溯到上一个节点，继续探索其他未访问的节点。
5. 重复上述过程，直到所有节点都被访问过。

与广度优先搜索（BFS）的区别在于，BFS使用队列数据结构，一层一层地遍历图，而DFS使用栈（通常是通过递归或显式栈实现）来深入探索。

在树上的应用包括查找路径、拓扑排序和生成最小生成树。在图上的应用包括查找连通分量、解决迷宫问题和网络爬虫。

以下是一个简单的DFS代码示例，使用递归实现：

```python
def dfs(graph, node, visited):
    if node not in visited:
        print(node)
        visited.add(node)
        for neighbor in graph[node]:
            dfs(graph, neighbor, visited)

# 示例图
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

visited = set()
dfs(graph, 'A', visited)
```

在这个示例中，`dfs`函数递归地访问每一个节点，并使用`visited`集合来跟踪已经访问过的节点，避免重复访问。
assistant