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

Posted 程序设计实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图结构的深度优先遍历与广度优先遍历相关的知识,希望对你有一定的参考价值。

前言

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

数据结构定义

//边表节点
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;        }    } }


以上是关于图结构的深度优先遍历与广度优先遍历的主要内容,如果未能解决你的问题,请参考以下文章

Java数据结构54:图的深度优先遍历与广度优先遍历数据结构课程设计

数据结构C语言版 图的广度优先遍历和深度优先遍历 急急急 会查重

数据结构与算法图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )

多级树的深度优先遍历与广度优先遍历(Java实现)

c语言图的遍历,邻接表存储,深度,广度优先遍历

PHP数据结构-图的遍历:深度优先与广度优先