当前位置: 首页 > article >正文

6.3.2图的深度优先遍历

知识总览:

树的先根遍历:

采用递归一直找某个节点的子树直到找不到从上往下找

访问根节点1,1的子树有2、3、4,访问2,2节点子树有5访问5,5没有子树,退回到2,2还有子树6访问6,6没有子树再退回到2,2的子树都被访问了再退回到1,1还有子树3没访问访问3,3没子树退回到1,1还有子树4没访问访问4,4的子树有7、8,访问7,7没有子树退回到4,4还有子树8没访问访问8,8没子树退回到4,4的子树都访问了退回到1,1的子树都访问了,访问完毕。节点序列为1,2,5,6,3,4,7,8

 

 代码版图的深度优先遍历:

为了保证每个顶点不被重复访问,于是加了visited数组,跟广度优先遍历同

深度优先遍历就是直向遍历找子孙,找到一个方向之后就遍历到最底部,直到没有邻接点。就是假如A和B、C邻接,B和D邻接,C和E、F邻接,E和G邻接

深度优先遍历是找A,从A找到了B或C,然后找B的D,B、D这一条线找完了再去找A的C,然后找C的E,E的G,这一条线找完了找C的F,然后结束

A、B、D、C、E、G、F(访问谁就写谁的顺序)

广度优先遍历是横向遍历找大伯,找A,从A找到了B、C,再找B的D,再找C的E、F,再找D的B,B已经找着了就不找了,然后找E的G,再找F,再找G

A、B、C、D、E、F、G(访问谁就写谁的顺序)

代码版深度优先遍历-优化版:

跟广度优先遍历相同,如果是非连通图,可能会导致一些节点没有被访问,因此加了for循环visited数组来访问值为false的节点

 

复杂度分析

跟广度优先遍历同

空间复杂度:

主要看递归带来的空间复杂度,最差的递归就是1个顶点与其他顶点都相邻,递归深度为O(V),最好的是邻接1个顶点O(1),递归深度为1?

时间复杂度:

主要看访问顶点+边的时间复杂度

邻接矩阵还是确定行列顶点的数量来确定该顶点是否有邻接边,即与顶点数量有关与边无关O(v²),邻接表还是通过顶点数量+邻接边的数量来确定递归几次,因为每个边实际就访问一次,所以不用相乘?即O(V)+O(E)

 

深度优先遍历序列过程:

以邻接表为例:

从2出发(如下第一张图),先访问2节点,2节点的邻接点是1、6,访问1,1的邻接点是2、5,2被访问不再访问则访问5,5的邻接点是1已被访问不再访问退回到1,1的邻接点2、5都被访问退回到2,2还有6没有访问则访问6,6的邻接点是2、3、7,2被访问,3没有被访问访问3,3的邻接点是4、6、7,4没被访问访问4,4的邻接点是3、7、8,3被访问7没被访问访问7,7的邻接点是3、4、6、8,3,4,6被访问则访问8,8的邻接点是4、7,4,7被访问回退到7节点,7没有邻接点被访问了回退到4,4没有被访问的邻接点了回退到3,3也没有了回退到6,6没有回退到5,5没有回退到1,1没有回退到2,2没有结束

2、1、5、6、3、4、7、8(访问谁就把谁的节点号写在后边)

 

深度优先生成树:

跟广度优先生成树同,都是把该顶点首次被访问的边标红,然后去掉黑色的边剩下的部分就是深度优先生成树,邻接矩阵就一种表示方式所以深度优先生成树就一个,邻接表因为邻接边表示方式不同导致深度优先生成树可能会有多个

 

深度优先生成森林:

非连通图图有几个连通分量,生成几个深度优先生成树,然后几个深度优先生成树合起来叫深度优先生成森林

 

图的遍历与联通性:

DFS加了for循环visited数组中未被访问的逻辑后,因为未被访问的才会走DFS,所以无向图的非连通图有几个连通分量就会调用几次DFS,连通图因为递归的原因只调用一次DFS

有向图起始顶点到其他顶点都有路径只需调用1次BFS/DFS

 

  知识回顾:

。。。。。。。。。 纯属瞎写。。。。。。。。。

http://www.lryc.cn/news/2385797.html

相关文章:

  • 畅游Diffusion数字人(30):情绪化数字人视频生成
  • UE5 Va Res发送请求、处理请求、json使用
  • 关于flutter中Scaffold.of(context).openEndDrawer();不生效问题
  • 【C++】深入理解C++中的函数与运算符重载
  • 【读代码】BAGEL:统一多模态理解与生成的模型
  • 隧道自动化监测解决方案
  • 如何通过EventChannel实现Flutter与原生平台的双向通信?
  • 游戏引擎学习第307天:排序组可视化
  • java接口自动化初识
  • 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎,支持现实世界的流程自动化需求
  • 时序数据库IoTDB的分片与负载均衡策略深入解析
  • NVM安装使用及问题解决
  • C++学习之STL学习:string类使用
  • 基于 STC89C52 的养殖场智能温控系统设计与实现
  • redis哨兵服务
  • 5月24日day35打卡
  • 嵌入式<style>设计模式
  • Kotlin 中该如何安全地处理可空类型?
  • 基于大模型预测的视神经脊髓炎技术方案
  • 使用防火墙禁止程序联网(这里禁止vscode)
  • Linux(7)——进程(概念篇)
  • 前端流行框架Vue3教程:24.动态组件
  • Unity3D仿星露谷物语开发48之显示树桩效果
  • [Datagear] 实现按月颗粒度选择日期的方案
  • 漏洞检测与渗透检验在功能及范围上究竟有何显著差异?
  • DB-GPT扩展自定义Agent配置说明
  • 基于SamOutV8的序列生成模型实现与分析
  • 家政维修平台实战09:推送数据到多维表格
  • 前端框架token相关bug,前后端本地联调
  • PyQt学习系列05-图形渲染与OpenGL集成