欧拉图的遍历算法(递归)是否能改成迭代实现
我现在要遍历一个欧拉图,找出一条欧拉回路,采用的算法是:
选择一个起始顶点然后进行递归,对每一步来说:
1,搜索该点是否有新的相邻顶点,有则转到2,没有则将该点加入欧拉回路然后返回;
2,如果该顶点有新的相邻顶点,则依次对这些新相邻顶点进行处理,直到没有新的相邻顶点;
3,处理的方法为:将该顶点到该新相邻顶点间的弧标记为已访问;对该相邻顶点进行递归,然后把该顶点加入回路的末尾。
写的代码如下:
private void findEluer(int curr)
{
//搜索一个新的相邻顶点
int oneNeighbor = getOneNeighbor(curr);
if (oneNeighbor == -1) //没有新的相邻顶点
{
//该点加入回路
pathNode.Add(curr);
}
else
{
do
{
//访问该边
arc[curr].visit = ture;
//对该邻居进行递归
findEluer(oneNeighbor);
//搜索该结点的下一个邻居,以便返回后依次处理邻居
oneNeighbor = getOneNeighbor(curr);
} while (oneNeighbor != -1);
//该结点所有邻居已处理完毕,加入回路
pathNode.Add(curr);
}
}
问题:上述算法我在小数据量(900结点,4000弧左右)测试下能得到正确结果;
但现在所遍历的欧拉图数据量太大,大约有9000个结点,20000条左右的弧,用上述算法会导致堆栈溢出。
请问有什么方法可以进行改进?如何将递归改成迭代?
麻烦大家说详细一点,谢谢。