简述深度优先遍历和广度优先遍历,如何实现?
深度优先遍历(Depth-First Search, DFS)和广度优先遍历(Breadth-First Search, BFS)是两种常见的图遍历算法。它们的主要区别在于访问节点的顺序不同。
深度优先遍历(DFS)
深度优先遍历从图的某一节点(源节点)出发,访问尽可能深的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
广度优先遍历(BFS)
广度优先遍历从图的某一节点(源节点)出发,访问所有相邻的节点,然后对每个相邻节点,再访问它们的相邻节点,这样一层一层地向下遍历,直到所有节点都被访问为止。
如何实现
以下是使用Python实现深度优先遍历和广度优先遍历的基本代码:
深度优先遍历(DFS)
def dfs(graph, start):
visited = set()
stack = [start]
while stack:
vertex = stack.pop()
if vertex not in visited:
visited.add(vertex)
stack.extend(graph[vertex] - visited)
return visited
在这个函数中,graph
是一个字典,表示图的邻接表。start
是开始遍历的节点。函数首先创建一个空集合visited
来保存已经访问过的节点,然后创建一个栈stack
,将开始节点放入栈中。然后,当栈不为空时,从栈中弹出一个节点,如果这个节点还没有被访问过,就将其添加到visited
中,并将其所有未访问过的邻居节点添加到栈中。最后,返回所有访问过的节点。
广度优先遍历(BFS)
def bfs(graph, start):
visited = set()
queue = [start]
while queue:
vertex = queue.pop(0)
if vertex not in visited:
visited.add(vertex)
queue.extend(graph[vertex] - visited)
return visited
在这个函数中,graph
和start
的含义与dfs
函数中的相同。函数首先创建一个空集合visited
来保存已经访问过的节点,然后创建一个队列queue
,将开始节点放入队列中。然后,当队列不为空时,从队列的头部弹出一个节点,如果这个节点还没有被访问过,就将其添加到visited
中,并将其所有未访问过的邻居节点添加到队列的尾部。最后,返回所有访问过的节点。
注意:以上代码假设graph
是一个字典,其中键是节点,值是与该节点相邻的节点的集合。并且,这些代码都没有处理可能的循环或孤立的节点,实际应用中可能需要添加额外的处理逻辑。