深度、广度优先生成树(C完整代码)

本文详细介绍了无向图的深度优先和广度优先生成树及森林的概念,提供了C语言的代码实现。通过孩子兄弟表示法转换非连通图的生成森林,并举例说明了遍历过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。

目录:
1.生成树和生成森林
       
深度、广度优先生成树
       
非连通图的生成森林
2.深度优先生成森林
       
深度优先生成森林简介
       
深度优先生成森林完整代码实现(c语言)

3.广度优先生成森林
       
广度优先生成森林简介
       
广度优先生成树完整代码实现(C语言)

1.生成树和生成森林

1.1深度、广度优先生成树

其实在对无向图进行遍历的时候,遍历过程中所经历过的图中的顶点和边的组合,就是图的生成树或者生成森林。

例如:
在这里插入图片描述
当使用深度优先搜索算法时,假设 V1 作为遍历的起始点,涉及到的顶点和边的遍历顺序为(不唯一):
在这里插入图片描述

此种遍历顺序构建的生成树为:
在这里插入图片描述
由深度优先搜索得到的树为深度优先生成树。同理,广度优先搜索生成的树为广度优先生成树,无向图以顶点 V1 为起始点进行广度优先搜索遍历得到的树,如下所示:
在这里插入图片描述

1.2非连通图的生成森林

非连通图在进行遍历时,实则是对非连通图中每个连通分量分别进行遍历,在遍历过程经过的每个顶点和边,就构成了每个连通分量的生成树。

非连通图中,多个连通分量构成的多个生成树为非连通图的生成森林。

2.深度优先生成森林

2.1深度优先生成森林简介

在这里插入图片描述

非连通图在遍历生成森林时,可以采用孩子兄弟表示法将森林转化为一整棵二叉树进行存储。

2.2深度优先生成森林完整代码实现(c语言)
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERtEX_NUM 20                   //顶点的最大个数
#define VRType int                          //表示顶点之间的关系的变量类型
#define VertexType int                     //图中顶点的数据类型
typedef enum{
   
   false,true}bool;               //定义bool型常量
bool visited[MAX_VERtEX_NUM];               //设置全局数组,记录标记顶点是否被访问过

typedef struct {
   
   
    VRType adj;                             //对于无权图,用 1 或 0 表示是否相邻;对于带权图,直接为权值。
}ArcCell,AdjMatrix[MAX_VERtEX_NUM][MAX_VERtEX_NUM];

typedef struct {
   
   
    VertexType vexs[MAX_VERtEX_NUM];        //存储图中顶点数据
    AdjMatrix arcs;                         //二维数组,记录顶点之间的关系
    int vexnum,arcnum;                      //记录图的顶点数和弧(边)数
}MGraph;
//孩子兄弟表示法的链表结点结构
typedef struct CSNode{
   
   
    VertexType data;
    struct CSNode * lchild;//孩子结点
    struct CSNode * nextsibling;//兄弟结点
}*CSTree,CSNode;
//根据顶点本身数据,判断出顶点在二维数组中的位置
int LocateVex(MGraph G,VertexType v){
   
   
    int i=0;
    //遍历一维数组,找到变量v
    for (; i<G.vexnum; i++) {
   
   
        if (G.vexs[i]==v) {
   
   
            break;
        }
    }
    //如果找不到,输出提示语句,返回-1
    if (i>G.vexnum) {
   
   
        printf("no such vertex.\n");
        return -1;
    }
    return i;
}
//构造无向图
void CreateDN(MGraph *G){
   
   
    scanf("%d,%d",&(G->vexnum),&(G->arcnum));
    getchar();
    for (int i=0; i<G->vexnum; i++) {
   
   
        scanf("%d",&(G->vexs[i]));
    }
    for (int i=0; i<G->vexnum; i++) {
   
   
        for (int j=0; j<G->vexnum; j++) {
   
   
            G->arcs[i][j].adj=0;
        }
    }
    for (int i=0; i<G->arcnum; i++) {
   
   
        int v1,v2;
        scanf("%d,%d",&v1,&v2);
        int n=LocateVex(*G, v1);
        int m=LocateVex(*G, v2);
        if (m==-1 ||n==-1) {
   
   
            printf("no this vertex\n");
            return;
        }
        G->arcs[n][m].adj=1;
        G->arcs[m][n].adj=1;//无向图的二阶矩阵沿主对角线对称
    }
}
int 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值