跳到主要内容

简述深度优先遍历和广度优先遍历,如何实现?

参考答案:

深度优先遍历(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

在这个函数中,graphstart的含义与dfs函数中的相同。函数首先创建一个空集合visited来保存已经访问过的节点,然后创建一个队列queue,将开始节点放入队列中。然后,当队列不为空时,从队列的头部弹出一个节点,如果这个节点还没有被访问过,就将其添加到visited中,并将其所有未访问过的邻居节点添加到队列的尾部。最后,返回所有访问过的节点。

注意:以上代码假设graph是一个字典,其中键是节点,值是与该节点相邻的节点的集合。并且,这些代码都没有处理可能的循环或孤立的节点,实际应用中可能需要添加额外的处理逻辑。