递归转非递归的常用方法是自己用栈来模拟,比较容易得到的方法是:
#include
#include
#include
#include
using namespace std;
const int maxn = 1000000;
vectorG[maxn];
int e[maxn];
bool visit[maxn];
void dfs(int u)
{
visit[u] = true;
cout << u << endl;
for(int i = 0; i < (int)G[u].size(); ++i) {
if(!visit[G[u][i]]) dfs(G[u][i]);
}
}
int n, s; // 结点数, 起点编号
int main()
{
cin >> n;
for(int i = 1; i <= n; ++i) {
int sz;
cin >> sz;
for(int j = 0; j < sz; ++j) {
int v;
cin >> v;
G[i].push_back(v);
}
}
cin >> s;
dfs(s);
cout << endl;
memset(visit, 0, sizeof(visit));
stackstk;
stk.push(s);
while(!stk.empty()) {
int u = stk.top(); stk.pop();
if(!visit[u]) {
cout << u << endl;
visit[u] = true;
}
for(; e[u] < (int)G[u].size(); ++e[u]) {
int v = G[u][e[u]];
if(visit[v]) continue;
stk.push(u); stk.push(v);
break;
}
}
return 0;
}
以上程序进行了一次递归遍历和依次非递归遍历,输入格式是:
10
1 8
1 4
1 9
2 2 5
2 4 8
3 10 7 8
1 6
3 1 5 6
2 3 10
2 6 9
8
第一行表示结点数,第[2..n+1]行每行表示编号为[1..n]的结点的邻接表(邻接点数量 结点编号...)
最后一行表示dfs的起点编号。