BFS、DFS分别为广度优先搜索和深度优先搜索的英文首字母缩写。
先考虑树的BFS、DFS。
树的BFS即层序遍历。层序遍历先访问根结点,再逐个访问根结点的子结点,再逐个访问上述子结点的子结点,以此类推,直至访问过所有结点。
树的DFS有三种(先序遍历、中序遍历、后序遍历),这里只说先序遍历。先序遍历先访问根结点,再逐个先序遍历根结点的所有子树。(由递归的定义可知,容易用递归算法实现(函数的递归用到了调用栈,开销较大,所以性能较差)。也可以自定义一个栈实现非递归算法。)
图1中的树,按层序遍历的访问顺序为ABCDEFGH。按先序遍历的访问顺序为ABDEFCGH。(这里是把树当作有序树,以左边结点为优先。)
C++示例代码如下:
#include
图的点之间关系是任意的,也就没有根结点和双亲、孩子、兄弟等概念。搜索可以从任意一个点开始,自然也要注意某个点是否已访问过。
图的BFS跟树的层序遍历类似,访问任意一个点,再逐个访问该点的邻接点,再逐个访问上述邻接点的邻接点,