深度优先搜索(DFS)和广度优先搜索(BFS)是两种常见的图遍历算法。
深度优先搜索可以理解为从一个起点开始,一直走下去,直到不能再走为止,然后回溯到上一个未曾探索完的节点,继续向下探索。这个过程可以看作是沿深度方向遍历图或树结构。在DFS算法中,需要使用一个栈来保存已经探索的节点,以便进行回溯。DFS算法的时间复杂度为O(V+E),其中V表示节点数,E表示边数。
广度优先搜索可以理解为从一个起点开始,按照距离逐层扩展,先访问距离起点最近的所有节点。这个过程可以看作是沿宽度方向遍历图或树结构。在BFS算法中,需要使用一个队列来保存已经探索但还未被访问的节点。BFS算法的时间复杂度为O(V+E),其中V表示节点数,E表示边数。
简而言之,深度优先搜索是优先遍历深度方向,即尽可能往深处探索;而广度优先搜索则是优先遍历广度方向,即尽可能多地探索与起点距离相近的节点。
相关示例代码:
深度优先:
# 定义节点类
class Node:
def __init__(self, val=None, children=None):
self.val = val
self.children = children if children is not None else []
# 深度优先遍历算法实现
def dfs(node: 'Node') -> List[int]:
res = []
stack = [node] # 定义栈,并将根节点加入栈中
while stack:
cur = stack.pop() # 取出栈顶元素
res.append(cur.val) # 将当前节点值保存到结果集中
# 将当前节点的所有子节点逆序加入栈中,保证下一次取出的节点是最左边的子节点
for child in cur.children[::-1]:
stack.append(child)
return res
广度优先:
# 定义节点类
class Node:
def __init__(self, val=None, children=None):
self.val = val
self.children = children if children is not None else []
# 广度优先遍历算法实现
def bfs(node: 'Node') -> List[int]:
res = []
queue = [node] # 定义队列,并将根节点加入队列中
while queue:
cur = queue.pop(0) # 取出队首元素
res.append(cur.val) # 将当前节点值保存到结果集中
# 将当前节点的所有子节点依次加入队列尾部
for child in cur.children:
queue.append(child)
return res
上述代码是一个Python语言实现的广度优先搜索算法。同样地,定义了一个节点类,每个节点包含一个值属性和一个子节点列表属性。在算法中我们使用一个队列来保存待访问节点,从而按照层次遍历整个树。该算法的时间复杂度为O(N),其中N是节点数。
以上就是深度优先和广度优先算法的示例代码,希望可以帮助理解这两种图遍历算法。