参考二叉树的先序遍历的迭代实现,图仍然可以借助栈迭代实现深度优先搜索。
(图为《数据结构C++语言版》(邓俊辉)片段)
二叉树的先序遍历只需要用栈记录下途经节点,而图类似,也是记录下深度搜索中的途径节点。
代码如下:
template<typename Tv, typename Te>template<typename VST>//VST为函数对象
void GraphMatrix<Tv, Te>::trav_dfs_my(int initNode, VST visit)
{
reset();
int* stack = new int[100];//手动创造简易的栈
int top = -1;//栈顶的指针
stack[++top] = initNode;//先让第一个节点入栈
int centNode = initNode, succNode = 0;
bool hassucc = true;
status(initNode) = VISITED;//访问第一个节点,标记状态为visited
visit(V[initNode].data);
while (true)
{
for (succNode = 0; succNode < n; succNode++)
{
if (E[centNode][succNode] != NULL)
{
if (status(succNode) == UNDISCOVERED)
{
status(succNode) = VISITED;//如果是没有访问过的节点,标记为visited
visit(V[succNode].data);//并且访问、入栈(记录)
stack[++top] = succNode;
centNode = succNode;//并且下一轮迭代以后继节点为中心
break;
}
}
}
if (top == -1)//如果栈清空,则代表遍历完成
break;
if (succNode == n)//如果深度搜索走到头了,则回溯
{
top--;
centNode = stack[top];//回溯一次,取第二个数,但第二个不出栈
if (top == -1)
{
break;
}
}
}
}
举个例子:
(图为《数据结构C++语言版》(邓俊辉)片段)
#include<iostream>
using namespace std;
#include"GraphMatrix.h"//邻接矩阵
template<typename T>
struct display//函数对象
{
virtual void operator()(T e)
{
cout << e << endl;
}
};
int main()
{
GraphMatrix<char, int> g = GraphMatrix<char, int>();
for (int i = 0; i < 7; i++)
{
g.insert((char)(i + 97));
}
char inNode[] = {
'a','a','a','b','d','d','e','f','g','g' };
char outNode[] = {
'b','f','c','c','a','e','f','g','a','c' };
for (int i = 0; i < sizeof(inNode) / sizeof(inNode[0]); i++)
{
g.insert(1, 1, int(inNode[i]) - 97, int(outNode[i]) - 97);//构造图
}
g.trav_dfs_my(3, display<char>());//调用dfs迭代版
return 0;
}