【大话数据结构C语言】42 图的深度优先遍历

欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取资源
程序员技术交流①群:736386324 ,程序员技术交流②群:371394777    

还是类比学习,这里使用树来对比
 
树因为根结点只有一个,并且所有的结点都只有一个双亲,所以不是很难理解
但是图就比较复杂了,原因是图的任一顶点都可以和其余的所有顶点相邻接,因此极有可能存在重复走过某个顶点或漏了某个顶点的遍历过程
 
因此就引出了图的遍历方法,大佬们设计了两种遍历次序方案: 深度优先遍历和广度优先遍历
 
深度优化遍历(DepthFirstSearch),也有称为深度优化搜索,简称为DFS
它的具体思想类似于在家里找钥匙的方案,无论从哪一间房间开始都可以,将房间内的墙角、床头柜、床上、床下、衣柜、电视柜等挨个寻找,做到不放过任何一个死角,当所有的抽屉、储藏柜中全部都找遍,接着再寻找下一个房间
 
 
使用迷宫分析问题:

右手原则:
在没有碰到重复顶点的情况下, 分叉路口始终是向右手边走,每路过一个顶点就做一个记号右手原则:在没有碰到重复顶点的情况下,分叉路口始终是向右手边走,每路过一个顶点就做一个记号
 
其实深度优先遍历就是一个递归的思想
 
 
你可能发现整个过程是一个树的遍历,下边是遍历的过程

 
 
代码实现:
AdList_DFS.c
#define TRUE 1
#define FALSE 0
#define MAX 256

typedef int Boolean;    // 这里我们定义Boolean为布尔类型,其值为TRUE或FALSE
Boolean visited[MAX];   // 访问标志的数组

void DFS(GraphAdjList GL, int i)
{
    EdgeNode *p;
    
    visited[i] = TRUE;
    printf("%c " GL->adjList[i].data);
    p = GL->adjList[i].firstEdge;
    
    while(p)
    {
        if( !visited[p->adjvex] )
        {
            DFS(GL, p->adjvex);
        }
        p = p->next;
    }
}

// 邻接表的深度遍历操作
void DFSTraverse(GraphAdjList GL)
{
    int i;
    
    for( i=0; i < GL->numVertexes; i++ )
    {
        visited[i] = FALSE;     // 初始化所有顶点状态都是未访问过状态
    }
    
    for( i=0; i < GL->numVertexes; i++ )
    {
        if( !visited[i] )       // 若是连通图,只会执行一次
        {
            DFS(GL, i);
        }
    }
}

 

 
AdMatrix_DFS.c
#define TRUE 1
#define FALSE 0
#define MAX 256

typedef int Boolean;    // 这里我们定义Boolean为布尔类型,其值为TRUE或FALSE
Boolean visited[MAX];   // 访问标志的数组

void DFS(MGraph G, int i)
{
    int j;
    
    visited[j] = TRUE;          // 访问过的顶点设置为TRUE
    printf("%c ", G.vexs[i]);   // 打印顶点
    for( j=0; j < G.numVertexes; j++ )
    {
        if( G.arc[i][j]==1 && !visited[j] )
        {
            DFS(G, j);          // 对为访问的邻接顶点递归调用
        }
    }
}

// 邻接矩阵的深度遍历操作
void DFSTraverse(MGraph G)
{
    int i;
    
    for( i=0; i < G.numVertexes; i++ )
    {
        visited[i] = FALSE;     // 初始化所有顶点状态都是未访问过状态
    }
    
    for( i=0; i < G.numVertexes; i++ )
    {
        if( !visited[i] )       // 若是连通图,只会执行一次
        {
            DFS(G, i);
        }
    }
}

 

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
限时福利限时福利,15000+程序员的选择! 购课后添加学习助手(微信号:csdn590),按提示消息领取编程大礼包!并获取讲师答疑服务! 套餐中一共包含5门程序员必学的数学课程(共47讲) 课程1:《零基础入门微积分》 课程2:《数理统计与概率论》 课程3:《代码学习线性代数》 课程4:《数据处理的最优化》 课程5:《马尔可夫随机过程》 哪些人适合学习这门课程? 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; 2)对算法数据结构掌握程度薄弱的人,数学可以让你更好的理解算法数据结构原理及应用; 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些: ①价值300元编程课程大礼包 ②应用数学优化代码的实操方法 ③数学理论在编程实战中的应用 ④程序员必学的5大数学知识 ⑤人工智能领域必修数学课 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。 如何听课? 1、登录CSDN学院 APP 在我的课程中进行学习; 2、登录CSDN学院官网。 购课后如何领取免费赠送的编程大礼包和加入答疑群? 购课后,添加助教微信: csdn590,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流!
后台技术选型: <ul style="color:#2F2F2F;"> <li> JDK8 </li> <li> MySQL </li> <li> Spring-boot </li> <li> Spring-data-jpa </li> <li> Lombok </li> <li> Freemarker </li> <li> Bootstrap </li> <li> Websocket </li> </ul> 小程序端技术选型 <ul style="color:#2F2F2F;"> <li> 微信小程序 </li> </ul> <div style="text-align:center;color:#2F2F2F;"> <div style="background-color:transparent;"> <div> </div> <div> <img alt="" src="https://upload-images.jianshu.io/upload_images/6273713-928017278f465cbd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp" /> </div> </div> <div style="font-size:14px;color:#969696;"> <br /> </div> </div> 小程序端 <div style="text-align:center;color:#2F2F2F;"> <div style="background-color:transparent;"> <div> </div> <div> <img alt="" src="https://upload-images.jianshu.io/upload_images/6273713-8d6c2b81701d32cd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp" /> </div> </div> <div style="font-size:14px;color:#969696;"> <br /> </div> </div> <ul style="color:#2F2F2F;"> <li> 扫码点餐 </li> <li> 菜品分类显示 </li> <li> 模拟支付 </li> <li> 评论系统 </li> <li> 购物车 </li> </ul> <p> <span><img alt="" src="https://img-bss.csdn.net/201907270119553529.png" /><br /> </span> </p> <p> <span><img alt="" src="https://img-bss.csdn.net/201907270120098756.png" /><br /> </span> </p> <p> <span><img alt="" src="https://img-bss.csdn.net/201907270120405331.png" /><br /> </span> </p> <p> <span><img alt="" src="https://img-bss.csdn.net/201907270120538298.png" /><img alt="" src="https://img-bss.csdn.net/201907270121012487.png" /><br /> </span> </p>
<p> <span style="color:#494949;font-size:14px;"><br /> </span> </p> <p> <span style="color:#494949;font-size:14px;">为什么人人都要学Git?</span><span style="color:#494949;font-size:14px;">Git的由来可不简单,最初是由Linux之父-林纳斯.托瓦兹为了更好管理Linux内核代码而编写的,</span><span style="color:#494949;font-size:14px;">Git用于版本控制,可以说是开发日常必备,很好的解决了代码合并的问题,经得起频繁多人修改的考验!</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14.6667px;"><br /> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">庞大的项目从来不是一个程序员可以搞定的,多人合作时代码版本管理显的尤为重要,千辛万苦改的Bug代码一合并没了怎么办?</span><span style="font-size:14px;">Git如此重要,相信作为程序员的你一定需要学习,2小时从根本理解Git!</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <span style="font-size:14px;color:#E53333;">学完即可轻松应对工作中 99% 以上的 日常代码管理 使用场景,实用性99.9999%!</span> </p> <p> <br /> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476"> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">这门课程,绝对不会让你觉得亏!</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <br /> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">Git基本用法+Git高级用法+Git原理+课程教辅</span> </p> <p style="font-size:11pt;color:#494949;"> <span style="font-size:14px;"> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">本课程实用性极强,边学边用!<span style="background-color:#FF9900;">零基础</span>也能轻松入门~</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;color:#E53333;">在这门课中,我们保证你能收获到这些</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">1)Git最佳实践</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">2)版本管理</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">3)分支管理</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">4)标签管理</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">5)解决冲突</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">6)Git信息存储原理</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">7)深入理解Git三大分区</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <br /> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <br /> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <br /> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> --------------------------------------------------------------- </p>
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页

打赏

我是CodeAllen

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值