数据结构--图的遍历 DFS

news2024/9/20 18:01:43

数据结构–图的遍历 DFS

树的深度优先遍历

//树的先根遍历
void PreOrder(TreeNode *R)
{
    if(R != NULL)
    {
        visit(R);   //访问根节点
        while(R还有下一个子树T)
            PreOrder(T);//先根遍历下一棵子树
    }
}

图的深度优先遍历

bool visited [MAX_VERTEX_NUM];   //访问标记数组
void DFS(Graph G, int v) //从顶点v出发,深度优先遍历图
{
    visit(v);//访问顶点
    visited[v] = TRUE; //设已访问标记
    {
        for(w = FirstNeighbor(G, v); w >= 0; w = NextNeighor(G, v, w))
            if(!visited[w]) //w为u的尚未访问的邻接顶点
                DFS(G, w);
    }
}

如果是⾮连通图,则⽆法遍历完所有结点

bool visited[MAX_VERTEX_NUM];   //访问标记数组

void DFSTraverse(Graph G)//对图G进行深度优先遍历
{
    for(v = 0; v < G.vexnum; ++v)
        visited[v] = FALSE;//初始化已访问标记数据
    for(v = 0; v < G.vexnum; ++v)
        if(!visited[v])DFS(G, v);//本代码中是从v=0开始遍历
}


void DFS(Graph G, int v) //从顶点v出发,深度优先遍历图G
{
    visit(v);//访问顶点v
    visited[v] = TRUE; //设已访问标记
    for(w = FirstNeighbor(G, v); w >= 0; w = NextNeighor(G, v, w))
        if(!visited[w]) //w为u的尚未访问的邻接顶点
            DFS(G,w);
}

复杂度分析

空间复杂度:来⾃函数调⽤栈,最坏情况,递归深度为 O ( ∣ V ∣ ) \color{red}空间复杂度:来⾃函数调⽤栈,最坏情况,递归深度为O(|V|) 空间复杂度:来函数调栈,最坏情况,递归深度为O(V)

空间复杂度:最好情况, O ( 1 ) \color{purple}空间复杂度:最好情况,O(1) 空间复杂度:最好情况,O(1)

时间复杂度=访问各结点所需时间+探索各条边所需时间

邻接矩阵 \color{red}邻接矩阵 邻接矩阵存储的图:
访问 |V| 个顶点需要O(|V|)的时间
查找每个顶点的邻接点都需要O(|V|)的时间,⽽总共有|V|个顶点
时间复杂度= O ( ∣ V ∣ 2 ) \color{red}O(|V|^2) O(V2)

邻接表 \color{red}邻接表 邻接表存储的图:
访问 |V| 个顶点需要O(|V|)的时间
查找各个顶点的邻接点共需要O(|E|)的时间,
时间复杂度= O ( ∣ V ∣ + ∣ E ∣ ) \color{red}O(|V|+|E|) O(V+E)

注:
同⼀个图的 邻接矩阵 \color{red}邻接矩阵 邻接矩阵表示⽅式 唯⼀ \color{red}唯⼀ ,因此 深度优先遍历序列唯⼀ \color{red}深度优先遍历序列唯⼀ 深度优先遍历序列唯
同⼀个图 邻接表 \color{red}邻接表 邻接表表示⽅式 不唯⼀ \color{red}不唯⼀ 不唯,因此 深度优先遍历序列不唯⼀ \color{red}深度优先遍历序列不唯⼀ 深度优先遍历序列不唯

深度优先⽣成树

同⼀个图的邻接矩阵表示⽅式唯⼀,因此深度优先遍历序列唯⼀,深度优先⽣成树也唯⼀
同⼀个图邻接表表示⽅式不唯⼀,因此深度优先遍历序列不唯⼀,深度优先⽣成树也不唯⼀

深度优先⽣成森林

图的遍历与图的连通性

⽆向图 \color{red}⽆向图 向图进⾏BFS/DFS遍历
调⽤BFS/DFS函数的次数=连通分量数

对于 连通图 \color{red}连通图 连通图,只需调⽤1次 BFS/DFS

有向图 \color{red}有向图 有向图进⾏BFS/DFS遍历
调⽤BFS/DFS函数的次数要具体问题具体分析

若起始顶点到其他各顶点都有路径,则只需调⽤1次
BFS/DFS 函数

对于 强连通图 \color{red}强连通图 强连通图,从任⼀结点出发都只需调⽤1次 BFS/DFS

知识回顾与重要考点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/820955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最长公共前缀_力扣14

文章目录 题目描述法一 横向比较 题目描述 法一 横向比较 将多个字符串比较转换为两两比较&#xff0c;如果比较完最长公共前缀已经是空串&#xff0c;则最长公共前缀一定是空串&#xff0c;因此不需要继续遍历剩下的字符串&#xff0c;直接返回空串。 string longestCommonPre…

Django实现音乐网站 ⑵

使用Python Django框架制作一个音乐网站&#xff0c;在系列文章1的基础上继续开发&#xff0c;本篇主要是后台歌手表模块开发。 目录 表结构设计 歌手表&#xff08;singer&#xff09;结构 创建表模型 设置图片上传路径 创建上传文件目录 生成表迁移 执行创建表 后台管…

uniapp 路由跳转方式

export function goBack(index, url) {if (index 1) { // 关闭当前页&#xff0c;返回上一页面或多级页面。uni.navigateBack({delta: url,animationType: pop-out,animationDuration: 300});} else if (index 2) { // 保留当前页&#xff0c;跳转到非tabbar页面&#xff0c;…

GWJDN-1000B高温介电温谱分析仪

GWJDN-1000B高温介电温谱分析仪 关键词&#xff1a;弹性常数等C-V ,介电常数&#xff0c;损耗角&#xff0c;电导率&#xff0c;C-特性 产品简介 GWJDN-1000B高温介电温谱分析仪采用当前的自动平衡电桥原理研制成功的新一高温介电温谱分析仪&#xff0c;产品全新的电子器件。…

【TypeScript】类型断言的基本使用

类型断言的概念 有些时候开发者比TS本身更清楚当前的类型是什么&#xff0c;可以使用断言&#xff08;as&#xff09;让类型更加精确和具体。 类型断言&#xff08;Type Assertion&#xff09;表示可以用来手动指定一个值的类型。 类型断言语法&#xff1a; 值 as 类型 或 <…

Character.AI搭建了用户创建AI角色并与之聊天的平台及社区

character Character.AI 公司是一家致力于通用人工智能&#xff08;AGI&#xff09;的全栈公司&#xff0c;于2021年10月创立&#xff0c;创始团队来自Google Brain和Meta AI&#xff0c;是深度学习、大型语言模型和对话领域的专家。Character.AI搭建了用户创建AI角色并与之聊…

Patchwork 黑客组织瞄准我国大学和研究机构

据知道创宇404高级威胁情报团队近期发现&#xff0c;名为“Patchwork”的黑客组织正以中国的大学和研究机构为目标进行活动&#xff0c;部署名为EyeShell的后门。 Patchwork也被称为“Operation Hangover”和“Zinc Emerson”&#xff0c;被怀疑是来自印度的APT组织。该组织发起…

d3dcompiler_47.dll缺失如何修复,教快速修复d3dcompiler_47.dll文件

在运行某些图形密集型应用程序或游戏时&#xff0c;你可能会遇到一条关于缺少d3dcompiler_47.dll文件的错误信息。这是一个常见的问题&#xff0c;今天我们主要就是来给大家讲解一下这方面的知识的&#xff0c;教大家怎么解决缺失d3dcompiler_47.dll的情况。 一. d3dcompiler_…

前端(十一)——Vue vs. React:两大前端框架的深度对比与分析

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;Vue vs. React&#xff1a;两大前端框架的深度对比与分析 文章目录 前言概述原理与设计思想算法生态系统与社区支持API与语法性能与优化开发体验与工程化对比总结结语 前言 在当今快速发展的前端领…

智能提词器有哪些?了解一下这款提词工具

智能提词器有哪些&#xff1f;使用智能提词器可以帮助你更好地准备和交付演讲、报告或其他提词场合。它可以提高你的效率&#xff0c;节省你的时间&#xff0c;并让你更加自信地与听众沟通。另外&#xff0c;智能提词器还可以提供一些有用的功能&#xff0c;如语音识别、智能建…

Jmeter用于接口测试中,关联如何实现

Jmeter用于接口测试时&#xff0c;后一个接口经常需要用到前一次接口返回的结果&#xff0c;应该如何获取前一次请求的结果值&#xff0c;应用于后一个接口呢&#xff0c;拿一个登录的例子来说明如何获取。 1、打开jmeter, 使用的3.3的版本&#xff0c;新建一个测试计划&#x…

C++和Lua交互总结

C和Lua交互总结 Chapter1. C和Lua交互总结一、Lua与C的交互机制——Lua堆栈二、堆栈的操作三、C 调用 Lua1&#xff09;C获取Lua值2&#xff09;C调用Lua函数示例&#xff1a; 四、Lua 调用 C包装C函数 最后总结一下 Chapter1. C和Lua交互总结 原文链接&#xff1a;https://bl…

无涯教程-Lua - 条件判断

if结构要求程序员确定一个或多个要由程序判断或测试的条件&#xff0c;以及要确定的条件为真的情况下要执行的一条或多条语句&#xff0c;如果条件为真&#xff0c;则执行指定语句&#xff0c;如果条件为假&#xff0c;则执行其他语句。 Lua编程语言假定布尔值 true 和 non-nil…

PHP高级检索功能的实现以及动态拼接sql

我们学习了解了这么多关于PHP的知识&#xff0c;不知道你们对PHP高级检索功能的实现以及动态拼接sql是否已经完全掌握了呢&#xff0c;如果没有&#xff0c;那就跟随本篇文章一起继续学习吧! PHP高级检索功能的实现以及动态拼接sql。完成的功能有&#xff1a;可以单独根据一个…

Python常用命令

1.python常用函数 type() 函数&#xff1a;查询对象的类型 input() 函数在&#xff1a;函数接受一个标准输入数据&#xff0c;返回为 string 类型 range() 函数&#xff1a;用于构造一个从[start, stop) &#xff08;不包含stop&#xff09;之间的连续的不可变的整数序列对象…

SpringBoot整合knife4j(快速入门超详细版)

前言 查看此文章前强烈建议先看这篇文章&#xff1a;Java江湖路 | 专栏目录 该文章纪录的是SpringBoot快速集成Knife4j&#xff0c;每一步都有记录&#xff0c;争取每一位看该文章的小伙伴都能操作成功。达到自己想要的效果~ 文章目录 前言1、什么是Knife4j2、SpringBoor整合K…

实现邮箱管理之gmail邮箱、office365(Azure)邮箱之披荆斩棘问题一览

要进行Office365邮箱的授权对接&#xff0c;你需要先申请一个应用&#xff0c;并获取授权访问令牌。 以下是一个简单的步骤&#xff1a; 登录 Azure 门户&#xff1a;https://portal.azure.com/创建一个新的应用程序&#xff0c;或者使用现有的应用程序。要创建新的应用程序&…

在人间烟火里,卡萨帝开启品牌新征程

大暑刚过天正热&#xff0c;尤其是在今年厄尔尼诺现象席卷太平洋的背景下&#xff0c;人们对空调的需求持续“升温”。CCTV2财经频道《正点财经》在专题报道中提到&#xff0c;6月国内空调产销两旺&#xff0c;同比增长均在35%以上。 炙热的天气下&#xff0c;南方居民有更加难…

PySpark 数据操作

数据输入 RDD对象 如图可见&#xff0c;PySpark支持多种数据的输入&#xff0c;在输入完成后&#xff0c;都会得到一个&#xff1a;RDD类的对象 RDD全称为&#xff1a;弹性分布式数据集&#xff08;Resilient Distributed Datasets&#xff09; PySpark针对数据的处理&…

【SAP MII学习】Day01--Overview, Security Services, and Workbench

1. Module 1: Overview 1.1 问题存在的原因 上图展示的是在工厂中IT的架构图&#xff0c;主要分为一下的三个层次&#xff1a; Shop Floor Automation and Control Systems (SFAC):collect data from the PLCs and sensors that are connected to the machinery on the facto…