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
    ...
例题