递归深度优先搜索(DFS)常见的一个bug

本文探讨了递归深度优先搜索(DFS)中常见的错误,特别是在遍历非二叉树时,因使用全局变量导致的问题。通过对比错误与正确代码,详细解释了如何避免将当前顶点与已访问顶点混淆。

关于递归深度优先搜索(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是存在边的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

培之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值