深度优先搜索和宽度优先搜索是两种不用的搜索理念。
深度优先搜索
深度优先搜索会选择当前节点的一个子节点进行深入,然后对子节点再进行深度优先搜索,一直搜索到叶节点,然后向上回溯,再对另一个子节点进行深度优先搜索。既先进行深度搜索,深度搜索无目标时进行宽度搜索。找到目标则结束搜索。
深度优先搜索用栈(stack)来实现
1、把根节点压入栈中。
2、从栈中弹出一个元素,检查是否为目标元素,如果是则结束。如果不是,则将其所有的子节点压入栈中,然后重复此步骤。
3、如果树遍历完毕还没有搜素到则结束。
宽度优先搜索(又称广度优先搜索)
宽度优先搜索则是对于当前节点,首先将当前节点的所有子节点都搜索一遍,如果没有目标,则对每一个子节点进行广度搜索,直到找到目标或者搜索完毕。既先进行宽度搜索,宽度搜索无目标时进行深度搜索。找到目标则结束搜索。
宽度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:
1、把根节点放到队列的末尾。
2、从队列的头部取出一个元素,检查是否为目标元素,如果是则结束。如果不是则将这个节点的所有子节点放到队列的末尾。然后重复此步骤。
3、如果树遍历完毕还没有搜素到则结束。
示例
对于以上树:
深度优先搜索的搜索顺序为:A->B->D->H->E->C->F->G
广度优先搜索的搜索顺序为:A->B-->C->D->E->F->G->H
参考: