DFS 和 BFS

DFS

想清楚几个关键点:
  • 底层支持dfs的数据结构是栈,这个栈可以是系统自动帮我们提供和维护(递归写法),也可以我们自己来模拟(迭代写法)
  • 注意任何时候栈里面维护的数据只是一条深度方向的路径,而不是维护整棵树,栈中的数据是动态更新的,代码处理技巧类似bfs给当前层级维护队列的技巧(之前有一次快手面试在这个点上犯迷糊了)
  • 注意回溯之后可能需要“恢复现场”
  • 注意有些问题可能需要剪枝优化
    • 最优性剪枝,剪掉一定不是最优解的方案
    • 可行性剪枝,剪掉一定不合法的方案
模板
visited = set()
def dfs(node, visited):
    visited.add(node)
    #process current node here
    ...
    for next_node in node.children():
        if not next_node in visited:
            dfs(next_node, visited)

例题

BFS

关键点
  • 宽搜自带“最短路”功能,限定条件是所有边长都为1
  • 宽搜需要借助队列这种数据结构来实现,类似地,任何时刻只需要维护当前层的数据
模板
def BFS(graph, start, end):
    
    queue = []
    queue.append([start])
    visited.add(start)
    
    while queue:
        node = queue.pop()
        visited.add(node)
        
        process(node)
        nodes = generate_related_nodes(node)
        queue.push(nodes)
        
    # other processing work
    ...
例题
posted @ 2021-04-24 11:12  呼_呼  阅读(62)  评论(0编辑  收藏  举报