深度优先搜索(DFS)解题总结

定义

深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。

例如下图,其深度优先遍历顺序为 1->2->4->8->5->3->6->7

image

算法步骤

  1. 访问顶点v;
  2. 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
  3. 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

算法模板

# 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 ,通常使用哈希表

适用场景

  • 二维数组

实战题目

参考资料

posted @ 2020-08-21 11:16  大杂草  阅读(904)  评论(0编辑  收藏  举报