前言
本文讨论的为简单图结构,不存在顶点到其自身的边,并且同一条边比重复出现。
数据结构定义
//边表节点
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;
}
}
}