关于递归深度优先搜索(DFS)常见的一个bug
概论:我想得到DFS遍历一棵树(非二叉树,是一颗一般的树)的顶点访问顺序,所以用邻接矩阵表示这棵树,用全局变量cur表示当前访问的顶点序号,例如cur = 3,表示当前正在访问第3个顶点。其他的重要变量有:数组vis,标记城市是否被访问;数组cur,记录访问了的顶点;N,城市的数量。
bug是在一个应该用v的地方用了x[cur]。出错的原因是因为当回溯回去时,cur的值已经不是第一次进入函数的值了,因为cur是全局变量。
正确代码如下:
//adj是邻接矩阵,v是当前要访问的顶点
void DFS(int adj[][N], int v){
vis[v] = 1; //v是当前访问的节点
x[cur] = v; //cur是正在访问第几个城市(从1开始)
if (N == cur) return;
for(int i = 0; i < N; ++i){
if(0 == vis[i] && 1 == adj[v][i]){
//错误版本是if(0 == vis[i] && 1 == adj[x[cur]][i]){
cur = cur+1;
DFS(adj,i);
}
}
}
关键是这句
if(0 == vis[i] && 1 == adj[v][i]){
//错误版本是if(0 == vis[i] && 1 == adj[x[cur]][i]){
//意图表示顶点i未被访问且它和当前访问的顶点v是存在边的