大话数据结构--图的遍历

简介: 大话数据结构--图的遍历

7.4图的遍历


图的遍历是和树的遍历类似,我们希望从图中某一顶点出 发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍(Traversing Graph)。


7.4.1深度优先遍历


深度优先遍历(Deep_First_Search),称为简称DFS。

主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底...,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路,再换一条路继续走。

实例如下,序号代表的是遍历的顺序

从根节点 1 开始遍历,它相邻的节点有 2,3,4,先遍历节点 2,再遍历 2 的子节点 5,然后再遍历 5 的子节点 9

此时就从 9 回退到上一个节点 5,看下节点 5 是否还有除 9 以外的节点,没有继续回退到 2,2 也没有除 5 以外的节点,回退到 1,1 有除 2 以外的节点 3,所以从节点 3 开始进行深度优先遍历

同理从 10 开始往上回溯到 6, 6 没有除 10 以外的子节点,再往上回溯,发现 3 有除 6 以外的子点 7,所以此时会遍历 7

从 7 往上回溯到 3, 1,发现 1 还有节点 4 未遍历,所以此时沿着 4, 8 进行遍历,这样就遍历完成了

image.png

这好像就是树的前序前序遍历啊实际上不管是前序遍历,还是中序遍历,亦或是后序遍历,都属于深度优先遍历。


7.4.2广度优先遍历


广度优先遍历(Breadth_ First Search), 又称为广度优先搜索,简称BFS

指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点

image.png

它这个遍历类似图中的层序遍历

DFS 一般是解决连通性问题,而 BFS 一般是解决最短路径问题

#include<stdio.h> #include<stdlib.h> #define max 20 //边表节点 typedef struct node{ int adjvex; struct node *next; }eNode; //头节点 typedef struct headnode{ char vertex; eNode *firstedge; }hNode; //邻接表 typedef struct{ hNode adjlist[max]; int n,e;   //顶点数,边数 }linkG;

#include<stdio.h>
#include<stdlib.h> 
#define max 20
//边表节点 
typedef struct node{
  int adjvex;
  struct node *next; 
}eNode;
//头节点
typedef struct headnode{
  char vertex;
  eNode *firstedge;
}hNode; 
//邻接表
typedef struct{
  hNode adjlist[max];
  int n,e;   //顶点数,边数 
}linkG; 
//创建(邻接表) 
linkG *creat(linkG *g,int c) //c为0表示无向图 
{
  int i,j,k;
  eNode *s;
  int n1,e1;
  char ch;
  g=(linkG *)malloc(sizeof(linkG));
  printf("请输入顶点数及边数: ");
  scanf("%d%d",&n1,&e1);
  g->n=n1;g->e=e1;
  printf("请输入顶点信息:");
  getchar();
  for(i=0;i<n1;i++)
  {
    scanf("%c",&ch);
    g->adjlist[i].vertex=ch;
    g->adjlist[i].firstedge=NULL;
   } 
   getchar();
   int i1,j1;
   for(k=0;k<e1;k++)
   {
    printf("请输入对(i,j): ");
    scanf("%d%d",&i1,&j1);
    s=(eNode *)malloc(sizeof(eNode));
    s->adjvex=j1;
    s->next=g->adjlist[i1].firstedge;
    g->adjlist[i1].firstedge=s;
    if(c==0)
    {
      s=(eNode *)malloc(sizeof(eNode));
      s->adjvex=i1;
      s->next=g->adjlist[j1].firstedge;
      g->adjlist[j1].firstedge=s;
      } 
   }
   return g;
}
int visited[max]; //标记是否访问 
//深度优先遍历DFS
void dfs(linkG *g,int i) //顶点i
{
  eNode *p;
  printf("%c ",g->adjlist[i].vertex);
  visited[i]=1;
  p=g->adjlist[i].firstedge;
  while(p)
  {
    if(!visited[p->adjvex])
      dfs(g,p->adjvex);
    p=p->next;
  }
}
void dfstravel(linkG *g)
{
  int i;
  for(i=0;i<g->n;i++)
    visited[i]=0;
  for(i=0;i<g->n;i++)
    if(!visited[i])
      dfs(g,i);
 } 
//广度优先遍历BFS
void bfs(linkG *g,int i) 
{
  int j;
  eNode *p;
  int q[max],front,rear;
  front=rear=0;
  printf("%c ",g->adjlist[i].vertex);
  visited[i]=1;
  q[rear++]=i;
  while(rear>front)
  {
    j=q[front++];
    p=g->adjlist[j].firstedge;
    while(p)
    {
      if(visited[p->adjvex]==0)
      {
        printf("%c ",g->adjlist[p->adjvex].vertex);
        q[rear++]=p->adjvex;
        visited[p->adjvex]=1;
      }
      p=p->next;
    }
  }
}
void bfstravel(linkG *g)
{
  int i,count=0;
  for(i=0;i<g->n;i++)
    visited[i]=0;
  for(i=0;i<g->n;i++)
    if(!visited[i])
      bfs(g,i);
}
//主函数 
int main()
{
  linkG *g;
  g=creat(g,0);
  printf("DFS:");
  dfstravel(g);
  printf("\n");
  printf("BFS:");
  bfstravel(g);
  printf("\n");
}

相关文章
|
1月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
6月前
【数据结构】二叉树(遍历,递归)
【数据结构】二叉树(遍历,递归
35 2
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
25 0
|
2月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
3月前
【数据结构】遍历二叉树(递归思想)-->赋源码
【数据结构】遍历二叉树(递归思想)-->赋源码
53 4
|
4月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
41 1
|
6月前
|
机器学习/深度学习
数据结构——二叉树四种遍历的实现-1
数据结构——二叉树四种遍历的实现
数据结构——二叉树四种遍历的实现-1
|
5月前
|
存储 算法
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
62 0
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
|
5月前
|
编译器 数据库 索引
数据结构篇:树形数据结构的基本概念及其遍历方法
数据结构篇:树形数据结构的基本概念及其遍历方法
80 0
|
6月前
|
机器学习/深度学习 算法 分布式数据库
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(下)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
40 1