定义
深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
例如下图,其深度优先遍历顺序为 1->2->4->8->5->3->6->7
算法步骤
- 访问顶点v;
- 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
- 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。
算法模板
# Python 递归写法
visited = set()
def dfs(node, visited):
if node in visited: # terminator
# already visited
return
visited.add(node)
# process current node here.
...
for next_node in node.children():
if next_node not in visited:
dfs(next_node, visited)
# 非递归写法
def DFS(self, root):
if tree.root is None:
return []
visited, stack = [], [root]
while stack:
node = stack.pop()
visited.add(node)
process (node)
# 生成相关的节点
nodes = generate_related_nodes(node)
stack.push(nodes)
# other processing work
...
// Golang 递归写法
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
var visited map[*TreeNode]bool = make(map[*TreeNode]bool)
func dfs(node *TreeNode, visited *map[*TreeNode]bool) {
if _,ok:= (map[*TreeNode]bool)visited[node]; ok { // terminator
// already visited
return
}
(map[*TreeNode]bool)visited[node] = true
// process current node here
...
for _,next_node := range node.children() {
if _,ok := (map[*TreeNode]bool)visited[next_node]; !ok{
dfs(next_node, visited)
}
}
}
// 非递归写法
func DFS(root *TreeNode) {
if root == nil {
return
}
visited := make(map[*TreeNode]bool)
stack := make([]*TreeNode, 0)
stack = append(stack, root)
for len(stack) > 0 {
node = stack[len(stack)-1]
stack = stack[:len(stack)-1]
visited[node] = true
process(node)
// 生成相关的节点
nodes = generate_related_nodes(node)
stack.push(nodes)
}
// other processing work
}
要点
- 使用栈 stack
- 记录已访问节点 visited ,通常使用哈希表
适用场景
- 树
- 图
- 二维数组