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