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

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.xdnf.cn/news/8586.html

相关文章:

  • 跨模态行人检索方法综述(上)
  • 使用YouDDNS-Docker为飞牛NAS配置YouDDNS动态域名解析
  • 如何选用正确的html元素
  • 2025年渗透测试面试题总结-匿名[社招]安全工程师(中级红队)(题目+回答)
  • 《Python语言程序设计》第4章第8题3个个位数之间比大小。‘a小于b而b大于c’这是最有漏洞的一个对比,请问我如何判断a和c
  • DeepSeek智能对话助手项目
  • 对神经正切核的理解和推导(1)
  • MRI大型数据集FastMRI介绍
  • Spring Boot中使用AMQP协议与RabbitMQ
  • 考研408《计算机组成原理》复习笔记,第二章(3)数值数据的运算和存储(定点数计算)
  • 【C】中断处理函数模板
  • JavaScript- 2.2 内置对象MATH
  • 精益数据分析(84/126):打造商业造钱机器——从融资思维到盈利模型的落地实践
  • Go核心特性与并发编程
  • 基于Springboot + vue3实现的养老系统
  • Java多线程编程最佳实践
  • 展示了一个三轴(X, Y, Z)坐标系!
  • RAID技术全解析:从基础到实战应用指南
  • 学习STC51单片机14(芯片为STC89C52RC)
  • OpenLayers 加载鹰眼控件
  • Kotlin中let、run、with、apply及also的差别
  • SQL 语言
  • 策略建模:AI系统背后的“心灵感应”技术
  • 一文快速了解Vue3服务端渲染(SSR)
  • Windows逆向工程提升之IMAGE_RESOURCE_DIRECTORY
  • linux taskset 查询或设置进程绑定CPU
  • Vue3的模块化设计: 使用Script Setup API
  • 人脸美颜磨皮祛痘3:深度学习SUNet神经网络实现图片修复(含训练代码、数据集和GUI交互界面)
  • 【MPC控制 - 从ACC到自动驾驶】ACC系统原理与MPC初步认知
  • P3392 涂条纹