概要
来看下图的另外一个应用,深度优先算法。
深度优先,听名字就知道,一条道走到黑;然后回溯到之前的起始点,遍历下一个节点,循环。
这是我理解的,其中用到了回溯的思想,遍历节点。
例子
有个走迷宫的例子。这个就是用的深度优先。一个路口走到头,不能再往里走了,也就是没路了,然后回答起始位置,重新往下个节点,一直走到没路位置。
我觉得有点暴力的思想,遍历所有节点,一直往下,如果有路,总能找到;没路,就是走到最后也没路可走,回来了又。遍历完所有节点,结束。
看下代码,下边。
代码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, tree): if tree.root is None: return [] visited, stack = [], [tree.root] while stack: node = stack.pop() visited.add(node) process (node) nodes = generate_related_nodes(node) stack.push(nodes)
小结
深度优先,图的应用
深度优先,很有趣的算法;代码也很经典,都值得学习。我记得最开始学的时候,给我的印象就是一条路走到黑,然后再走下一个节点。循环。跟广度优先不一样,先遍历跟它接触的所有节点,然后下一个,下一个。也挺好理解的。其实这么看。都是挺有趣的算法,还有快慢指针等等。