Loading

图结构的深度优先遍历与广度优先遍历

前言

本文讨论的为简单图结构,不存在顶点到其自身的边,并且同一条边比重复出现。

数据结构定义

//边表节点
class ArcNode
{
	public int adjvex;     //邻接点域
	public ArcNode next;
}

//顶点表节点
class VertexNode<T>
{
	public T vertex;
	public ArcNode firstedge;
}

深度优先遍历

思路

  • 访问顶点root
  • 从顶点root上没有被访问过的邻接点中选取一个顶点v,从v出发再次进行深度优先遍历
  • 重复上面两个步骤,直到图中所有与root路径相通的顶点都被访问到

核心方法:递归

代码

public void DFSTraverse(int v)
{
	ArcNode p = null;
	int j;
	Console.WriteLine(adjlist[v].vertex); //访问顶点
	visited[v] = 1;  //将顶点标记为已经访问过
	p = adjlist[v].firstedge; //工作指针p指向顶点v的边表

	//依次搜索顶点v的邻接点j
	while (p != null)
	{
		j = p.adjvex;
		if (visited[j] == 0)      //如果未被放问过则继续遍历
			DFSTraverse(j);
		p = p.next;
	}
}

广度优先遍历、

思路

  • 从某个顶点root出发,访问root
  • 依次访问root的各个没有被访问过的邻接点 a,b,c,d,e,f,g...
  • 分别从 a,b,c,d,e,f,g..出发依次访问它们未被访问的邻接点,并且使先被访问顶点的邻接点先于后被访问顶点的邻接点。直到图中所有顶点遍历完成

核心方法:循环

代码

public void BFSTraverse(int v)
{
	//使用队列实现,假设队列使用顺序存储
	int[] Q = new int[Program.MaxSize];
	int front = -1, rear = 1;           //初始化队列

	ArcNode p = null;
	Console.WriteLine(adjlist[v].vertex);

	//被访问过的顶点入队
	visited[v] = 1;
	Q[++rear] = v;

	//当队列非空时
	while (front != rear)
	{
		v = Q[++front];
		p = adjlist[v].firstedge;       //工作指针p指向顶点v的边表
		while (p != null)
		{
			int j = p.adjvex;          //j是顶点v的邻接点
			if (visited[j] == 0)
			{
				Console.WriteLine(adjlist[j].vertex);
				visited[j] = 1;
				Q[++rear] = j;
			}
			p = p.next;
		}
	}
}
posted @ 2017-11-05 19:20  程序设计实验室  阅读(395)  评论(1编辑  收藏  举报