深度优先搜索(DFS)
首先回顾之前已经介绍过的广度优先搜索。在由状态的转移和扩展构成的解答树中,广度优先搜索按照层次遍历所有的状态,直到找到我们需要的状态。
与其相对的,假如我们改变对解答树的遍历方式,改为优先遍历层次更深的状态,直到遇到一个状态结点,其不再拥有子树,则返回上一层,访问其未被访问过的子树,直至解答树中所有的状态都被遍历完毕。这个过程,类似于树的前序遍历。其遍历顺序如下图所示:
在搜索过程中为了达到这一目的,我们立即扩展新得到的状态,而更早得到的状态则更迟得到扩展。在广度优先搜索中,我们使用队列来实现较早得到的状态较先得到扩展,这是利用了队列先进先出的特性。
那么这里,为了实现先得到的状态后得到扩展的效果,我们按理将使用堆栈保存和扩展搜索过程得到的状态,但是考虑到我们同样可以利用上节所提到的递归程序来实现这一功能,所以这里给出的深度优先遍历不使用堆栈而是使用递归程序。
由于其缺少了广度搜索中按层次递增顺序遍历的特性。所以当深度优先搜索搜索到我们需要的状态时,其不再具有某种最优的特性。所以,在使用深度优先搜索时,我们更多的求解有或者没有的问题,即对解答树是否有我们需要的答案进行判定,而一般不使用深度优先搜索求解最优解问题。