图的深度优先搜索迭代实现

参考二叉树的先序遍历的迭代实现,图仍然可以借助栈迭代实现深度优先搜索。
在这里插入图片描述
(图为《数据结构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;
}

おすすめ

転載: blog.csdn.net/jsh_19869/article/details/114296110
おすすめ