【数据结构与算法】递归全流程详细剖析 | 详解图的深度优先遍历

2023-05-16

🚀 作者 :“大数据小禅”

🚀文章简介:本篇文章属于数据结构与算法系列文章,这篇文章会对算法中的递归进行一个详细的介绍,不仅是概念,而是从运行过程中的每一步进行详细分析。并使用递归的方式来完成数据结构图的深度优先遍历

🚀个人主页: 大数据小禅

在这里插入图片描述

图的遍历与递归

      • 1. 递归初体验
        • 1.1 使用递归实现阶乘操作
      • 2. 递归调用详解
        • 2.1 普通的函数递归调用过程
        • 2.2 递归函数的调用过程
      • 3. 图的深度优先遍历DFS
        • 3.1 图的表示
        • 3.2 图的深度优先遍历
        • 3.3 详解深度优先种的递归遍历
        • 3.4 递归过程执行流程详解

1. 递归初体验


  • 什么是递归
    • 递归就是一个程序或者是函数在调用自身的一种方法。
    • 这一种方法通常是把一个复杂的问题经过层层的转化为跟原问题相似但规模较小的问题来求解。
    • 递归策略只需要使用少量的程序就可以把解题过程需要多次的重复计算描述出来,大大的减少了代码量。
    • 一般来说递归需要边界条件,递归前进段和递归返回段,当边界条件不满足的时候,递归前进,当边界条件满足的时候就递归返回。
  • 递归必须具备条件
    • 自己调用自己
    • 有终止条件

1.1 使用递归实现阶乘操作

        public static void main(String[] args) {
            int result = factorial(5);
            System.out.println("5的阶乘结果是:"+result);

        }
        // 求n的阶乘

        public static int factorial(int n) {
            if (n <=1) {
                return 1;
            }
            return n * factorial(n - 1);
        }
输出:
5的阶乘结果是:120

2. 递归调用详解

2.1 普通的函数递归调用过程

  • 步骤1:函数A执行,调用函数B,这个时候A函数暂时挂起,函数B调用函数C,B暂时挂起
  • 步骤2:函数C执行完之后,就回到B函数调用C函数的地方,去执行C函数调用后B函数还没执行完的的其他逻辑:。
  • 步骤3:整个执行完之后B函数也执行完了,再返回到A函数调用B函数的地方,继续执行B函数下面的所有逻辑
    在这里插入图片描述

2.2 递归函数的调用过程

  • 跟普通函数的调用没什么区别,就是每一次调用的是自己,调用自己后挂起,去执行调用的本身的函数。
  • 传入的参数会变化,执行到了终止的条件之后一样往回执行之前接下去没有执行完的代码。
    在这里插入图片描述

3. 图的深度优先遍历DFS


  • 图是一种数据结构 每一种数据结构都必须有"遍历"的方式

  • 很多算法 本质就是“遍历” ** 对于图论,真正理解"遍历"可以解决80%**的面试问题

  • 通常不会用图这种数据结构来存储数据,或者进行搜索查找的任务。更多的是存储一种拓扑关系,之后通过图论算法来寻找这种拓扑关系中隐藏的性质。比如看两个节点是否相连,最短路径,或者一个图的最小生成树

  • 对树的遍历一般不需要整棵树的元素遍历 但是图的话一般是寻找图中某种拓扑结构的性质,想要得到一般需要把整个图遍历一遍,遍历过程中可能还需要不断记录一些信息,最终得到结果。

3.1 图的表示

图的基本概念与图的基本表示
图的表示可以看我的前一篇文章 这里采用邻接表的方式来表示一个图无向无权图。

3.2 图的深度优先遍历

1 深度优先遍历,从给定的起始节点出发,起始节点一般有多个相邻节点。深度优先遍历的策略就是先访问起始节点的第一个邻接节点,
然后再以这个被访问的邻接结点作为新的起始节点,再访问它的第一个邻接结点。
指导遍历完成

2 深度优先遍历可通过递归的方式来完成,下面分析实现的核心代码与过程

3.3 详解深度优先种的递归遍历

在这里插入图片描述
核心部分代码:
在这里插入图片描述

3.4 递归过程执行流程详解

  1. int v=0开始,执行dfs(0),当前数组空,数组下标为0的地方标记为true,0添加进List。
  2. 访问0的相邻节点,1跟2,发现1不存在数组中,调用dfs(1),这个时候dfs(0)挂起先执行dfs(1)
  3. 数组下标为1的地方设置为true,把1添加进List,遍历节点1的相邻节点 0,3,4。这个时候0已经在数组中存在,跳过继续看3,发现3不在数组中,则把dfs(1)挂起,调用dfs(3).
  4. 把3添加进List中,3下标设置为true,继续走下面的逻辑。依次类推指导调用到dfs(5)。此时的调用路径是dfs(0)->dfs(1)->dfs(3)->dfs(2)->dfs(6)->dfs(5)。
  5. 此时的List中遍历结果为 0 1 3 2 6 5。调用到dfs(5)的时候发现5的所有相邻顶点都访问过了。
  6. 表示对于dfs(5)的调用for循环已经结束了,下面没有其他逻辑了。这个时候就要返回上一次递归调用的过程dfs(6)了。dfs(0)->dfs(1)->dfs(3)->dfs(2)->dfs(6)
  7. 回到dfs(6),把dfs(6)没执行完的逻辑继续执行。上次对dfs(6)执行到了遇到了5这个节点的时候就进行递归调用了,而5这个顶点已经结束调用,对于6这个顶点也是遍历完了。退回dfs(0)->dfs(1)->dfs(3)->dfs(2),依次类推,直到退回到dfs(3)这个时候,上次这个函数执行到了遍历递归节点2的时候就去递归调用了,这个时候dfs(2)已经调用完了,现在可以继续往下遍历,还有节点5.
  8. 这个时候dfs(5),5的相关顶点也已经是true了也不需要递归调用了,继续往回退dfs(0)->dfs(1)
  9. 上次调用dfs(1)的时候执行到了顶点3,现在继续往下执行,调用了dfs(4),这个时候顶点4还是没有被调用过的,记录为true,加入到List。 0 1 3 2 6 5 4。dfs(0)->dfs(1)->dfs(4).
  10. 调用完dfs(4),其相邻的顶点也已经被遍历完了,这个时候继续往回退,直到dfs(0)执行完相应顶点逻辑。到这里就遍历完成。

遍历结果

[0, 1, 3, 2, 6, 5, 4]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构与算法】递归全流程详细剖析 | 详解图的深度优先遍历 的相关文章

  • C语言/C++实现栈操作

    一 栈的概念 栈是一种常用的数据结构 它遵循先入后出 Last In First Out LIFO 的原则 栈的操作只在栈的一端进行 该端被称为栈顶 而另一端称为栈底 栈的基本操作包括压栈 入栈 push 和弹栈 出栈 pop 分别用于将元
  • 树06--二叉树中和为某一值的路径

    树06 二叉树中和为某一值的路径 jz24 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 输入一颗二叉树的根节点和一个整数 按字典序打印出二叉树中结点值的和为输入整数的所有路径 路径定义为从树的根结点开始往下一直到叶结点所经
  • 将二叉树转为有序的双向链表

    一 题目要求 输入一棵二叉排序树 现在要将该二叉排序树转换成一个有序的双向链表 而且在转换的过程中 不能创建任何新的结点 只能调整树中的结点指针的指向来实现 include
  • 数据结构之链表与线性表

    数据结构之链表与线性表 线性表 顺序线性表 顺序表 顺序线性表 使用数组实现 一组地址连续的存储单元 数组大小有两种方式指定 一是静态分配 二是动态扩展 优点 随机访问特性 查找O 1 时间 存储密度高 逻辑上相邻的元素 物理上也相邻 缺点
  • SDUT--OJ《数据结构与算法》实践能力专题训练6 图论

    A 数据结构实验之图论一 基于邻接矩阵的广度优先搜索遍历 Description 给定一个无向连通图 顶点编号从0到n 1 用广度优先搜索 BFS 遍历 输出从某个顶点出发的遍历序列 同一个结点的同层邻接点 节点编号小的优先遍历 Input
  • 循环单链表(C语言版)

    前言 小可爱们 本次一起来看看循环单链表吧 嘻嘻 一 循环单链表的定义 循环单链表是单链表的另一种形式 其结构特点链表中最后一个结点的指针域不再是结束标记 而是指向整个链表的第一个结点 从而使链表形成一个环 和单链表相同 循环链表也有带头结
  • 亚利桑那州立大学周纵苇:研习 U-Net ——现有的分割网络创新

    雷锋网AI研习社按 经典的 Encoder Decoder 结构在目标分割问题中展现出了举足轻重的作用 然而这样一个相对固定的框架使得模型在感受野大小和边界分割精度两方面很难达到兼顾 本次公开课 讲者以 U Net 为案例分析 总结现有的分
  • 数据结构与算法书籍推荐

    学习数据结构与算法 还是很有必要看几本相关的书籍 但根据不同基础的人 合适看的书也不一样 因此 针对不同层次 不同语言的人 推荐几本市面上口碑不错的书 1 入门级 针对刚入门的同学 建议不要急着去看那些经典书 像 算法导论 算法 这些比较经
  • UE4命令行使用,解释

    命令行在外部 从命令行运行编辑项目 1 导航到您的 LauncherInstall VersionNumber Engine Binaries Win64 目录中 2 右键单击上 UE4Editor exe 的可执行文件 并选择创建快捷方式
  • 图 - Java实现无向带权图的邻接矩阵表示法

    图 Java实现无向带权图的邻接矩阵表示法 1 图 1 1 图的介绍 图 Graph 是一种复杂的非线性表结构 图中的元素我们就叫做顶点 vertex 图中的一个顶点可以与任意其他顶点建立连接关系 我们把这种建立的关系叫做边 edge 跟顶
  • 数据结构——计算节点个数和二叉树高度(C语言版)

    摘自 数据结构 计算节点个数和二叉树高度 C语言版 作者 正弦定理 发布时间 2020 12 12 23 27 09 网址 https blog csdn net chinesekobe article details 111086664
  • 如何防止过拟合和欠拟合

    过拟合和欠拟合是模型训练过程中经常出现的问题 两种情况正好相反 现将两者的定义及如何防止进行简要总结 1 过拟合 1 1 定义 是指模型对于训练数据拟合呈现过当的情况 反映到评估指标上就是模型在训练集上的表现很好 但是在测试集上的表现较差
  • 数理统计知识整理——回归分析与方差分析

    题记 时值我的北科研究生第一年下 选学 统计优化 课程 备考促学 成此笔记 以谨记 1 线性回归 1 1 原理分析 要研究最大积雪深度x与灌溉面积y之间的关系 测试得到近10年的数据如下表 使用线性回归的方法可以估计x与y之间的线性关系 线
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • 机器学习算法GBDT的面试要点总结-上篇

    1 简介 gbdt全称梯度提升决策树 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一 在前几年深度学习还没有大行其道之前 gbdt在各种竞赛是大放异彩 原因大概有几个 一是效果确实挺不错 二是即可以用于分类也可以用于回归 三是可
  • Linux下进程退出的几种形式

    进程退出 Linux 下进程的退出分为正常退出和异常退出两种 1 正常退出 a 在main 函数中执行return b 调用exit 函数 c 调用 exit 函数 2 异常退出 a 调用about函数 b 进程收到某个信号 而该信号使程序
  • 【试题】排列组合

    在写一个远程的代码 如果本地有M个显示器 远程有N个显示器 M lt N 依据分辨率 显示器刷新频率等要求 需要对远程的N个显示器进行最佳分辨率修改 之后 需要从N个远程显示器中选择M个 跟本地显示器进行一对一的匹配 即从 A N M N
  • Leetcode2661. 找出叠涂元素

    Every day a Leetcode 题目来源 2661 找出叠涂元素 解法1 哈希 题目很绕 理解题意后就很简单 由于矩阵 mat 中每一个元素都不同 并且都在数组 arr 中 所以首先我们用一个哈希表 hash 来存储 mat 中每
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路

随机推荐

  • ubuntu安装lxde_如何在Ubuntu上安装轻量级LXDE桌面

    ubuntu安装lxde LXDE is a lightweight desktop alternative to Unity GNOME and KDE It s ideal for old computers or anyone loo
  • 【leecode每日一题】636. 函数的独占时间

    题目描述 xff08 链接 xff09 有一个 单线程 CPU 正在运行一个含有 n 道函数的程序 每道函数都有一个位于 0 和 n 1 之间的唯一标识符 函数调用 存储在一个 调用栈 上 xff1a 当一个函数调用开始时 xff0c 它的
  • 【正则表达式】一、常见符号含义

    正则表达式入门 常见字符含义 常见字符含义 ABC 匹配目标字符串中 内的字符 span class token keyword import span re span class token keyword if span name sp
  • Java中文件相对路径和绝对路径的用法(IO同样适用),系统找不到指定文件的解决办法讲解

    引入场景 xff1a 在我们日常开发中 xff0c 经常需要去读取文件的内容 xff0c 但经常出现文件未发现的问题 xff0c 如下图 xff1a 出现这个问题的原因就有二个 xff0c 第一是文件真的不存在 xff0c 第二就是文件明明
  • Java中的Collections类[80]

    Java中的Collections类 80 文章目录 Java中的Collections类 80 前言一 Collections基础使用二 查找与替换三 同步控制 线程安全 四 设置不可变集合五 其他方法六 小结 前言 本章将继续使用代码加
  • Ubuntu20.04修复Chrome提示缺少依赖项问题

    这两天正好需要用服务器跑一个脚本需要用到chrome xff0c 本打算在服务器上安装chrome xff0c 从官方那边下载完deb包 xff0c 安装的时候报了这个错 xff1a dpkg error processing packag
  • 【MySQL】MySQL进阶之路(六)MySQL三大日志(binlog、redo log和undo log)详解

    写在前面的话 脑子是个好东西 xff0c 可惜的是一直没有搞懂脑子的内存删除机制是什么 xff0c 所以啊 xff0c 入行多年 xff0c 零零散散的文章看了无数 xff0c 却总是学习了很多也忘了很多 痛定思痛的我决定从今天开始系统的梳
  • 《Spring》——Spring配置

    5 Spring配置 5 1 别名 xff1a span class token operator lt span span class token operator span span class token operator span
  • 解决VNC鼠标点击不反应问题

    1 xff09 查看连接的VNC进程 xff1b 2 xff09 杀掉VNC进程 3 xff09 重启VNC进程 上文4461是 xff1a 1的进程的编号 xff0c 这里要注意一下 xff1b 然后重启 xff1a 1进程就能解决问题
  • Ubuntu从python3安装到vim安装配置

    文章目录 python3编译安装安装python3相关依赖库下载python3软件包编译python3源码安装完成建立python3与pip3软链接将python3加入环境变量检查python3与pip3是否安装正常 vim编译安装及添加p
  • Windows安装配置解压版MySQL全过程笔记

    文章目录 安装包下载MySQL安装1 选择安装包2 解压安装包3 添加环境变量3 添加MySQL配置文件4 安装前的配置5 安装6 启动MySQL7 登录MySQL8 修改登录密码 Windows实现下远程连接1 配置MySQL用户2 设置
  • 如果忘记Mac密码该怎么办

    Can t remember your Mac s password Don t worry With the default settings you can simply try logging into your Mac Fail e
  • vxWorks7调试总结

    vxworks7 0调试总结 一直以来想看看新的vxworks7 0有什么变化 xff0c 最近抽了一段时间做了一个基于zedboard的vxworks的操作系统镜像 xff0c 刚开始就被很多新的问题困扰了很久 xff0c 首先是uboo
  • Idea中解决Git冲突问题及merge代码消失问题【git常用tips】

    Idea中解决Git冲突问题及merge代码消失问题 1 Idea中使用git的小问题及技巧 我们可以通过Idea直接从GitLab或GitHub等平台上拉取代码 File New Project from Version Control
  • E: Package ‘xxx‘ has no installation candidate 问题成功解决

    E Package xxx has no installation candidate 问题成功解决 分析 首先这个问题的最主要的原因就是因为当前Linux系统的下载源中找不到相应的文件 xff0c 所以说我们需要更新下载源 步骤 找到记录
  • 算法学习笔记:连通图详解

    什么是连通图 xff1f 在图论中 xff0c 连通图基于连通的概念 在一个无向图 G 中 xff0c 若从顶点 i 到顶点 j 有路径相连 xff08 当然从 j 到 i 也一定有路径 xff09 xff0c 则称 i 和 j 是连通的
  • GitHub Pages 绑定域名

    域名选购 域名注册商有很多 xff0c 国内的万网 xff0c 国外的 GoDaddy 等等 区别在于国内域名注册后需要备案 xff0c 因为政策因素也可能随时被停用 xff0c 相对的 xff0c 国外注册域名在交流和沟通方面不如国内方便
  • 【IDEA主题极致优化】全面优提升你的编码体验

    x1f680 作者 xff1a 大数据小禅 x1f680 文章简介 xff1a 使用IDEA的主题优化插件 xff0c 给IDEA更换主题 xff0c 换一种主题 xff0c 换一种心情敲代码 下面介绍如何使用IDEA主题插件进行主题更新
  • 【数据结构与算法】选择排序的实现

    x1f680 作者 xff1a 大数据小禅 x1f680 文章简介 xff1a 本篇文章使用的语言是Java xff0c 实现了选择排序 选择排序 1 选择排序基本介绍2 选择排序的排序思想3 选择排序的排序过程4 选择排序代码实现 1 选
  • 【数据结构与算法】递归全流程详细剖析 | 详解图的深度优先遍历

    x1f680 作者 xff1a 大数据小禅 x1f680 文章简介 xff1a 本篇文章属于数据结构与算法系列文章 xff0c 这篇文章会对算法中的递归进行一个详细的介绍 xff0c 不仅是概念 xff0c 而是从运行过程中的每一步进行详细