Python实现深度优先遍历(DFS)和广度优先遍历(BFS)

article/2025/9/13 1:38:38

一,简介

深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中。

二,深度优先遍历

主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底…,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路,再换一条路继续走。

树是图的一种特例(连通无环的图就是树),接下来我们来看看树用深度优先遍历该怎么遍历。

在这里插入图片描述

  1. 我们从根节点 1 开始遍历,它相邻的节点有 2,3,4,先遍历节点 2,再遍历 2 的子节点 5,然后再遍历 5 的子节点 9。
    在这里插入图片描述
  2. 上图中一条路已经走到底了(9是叶子节点,再无可遍历的节点),此时就从 9 回退到上一个节点 5,看下节点 5 是否还有除 9 以外的节点,没有继续回退到 2,2 也没有除 5 以外的节点,回退到 1,1 有除 2 以外的节点 3,所以从节点 3 开始进行深度优先遍历,如下:在这里插入图片描述
  3. 同理从 10 开始往上回溯到 6, 6 没有除 10 以外的子节点,再往上回溯,发现 3 有除 6 以外的子点 7,所以此时会遍历 7。
    在这里插入图片描述
  4. 从 7 往上回溯到 3, 1,发现 1 还有节点 4 未遍历,所以此时沿着 4, 8 进行遍历,这样就遍历完成了。
    完整的节点的遍历顺序如下(节点上的的蓝色数字代表):
    在这里插入图片描述
# 深度遍历目录
import os,collections
path = r'D:\test\work_file\meishi'def GetAllDirDeep(path):stack = []stack.append(path)# 处理栈,当栈为空时结束循环while len(stack) != 0:# 从栈里取出数据DirPath = stack.pop()#print("DirPath =",DirPath)# 目录下所有文件FileList = os.listdir(DirPath)#print("FileList =",FileList)# 循环处理每个文件for FileName in FileList:FileAbsPath = os.path.join(DirPath,FileName)#print("FileName ",FileName)if os.path.isfile(FileAbsPath) == True:print("是文件",FileAbsPath)else:print("是目录",FileAbsPath)stack.append(FileAbsPath)GetAllDirDeep(path)

三,广度优先遍历

广度优先遍历,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。

上文所述树的广度优先遍历动图如下,每个节点的值即为它们的遍历顺序。所以广度优先遍历也叫层序遍历,先遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。

在这里插入图片描述
深度优先遍历用的是栈,而广度优先遍历要用队列来实现,我们以下图二叉树为例来看看如何用队列来实现广度优先遍历。
在这里插入图片描述

import os,collections
path = r'D:\test\work_file\meishi'# 广度遍历目录
def GetAllDirScope(path):queue = collections.deque()# 进队queue.append(path)print("queue =",queue)while len(queue) != 0:# 出队数据FilePath = queue.popleft()#print(FilePath)# 找出所有的文件FileNameList = os.listdir(FilePath)for FileName in FileNameList:#print(FileName)FileAbsPath = os.path.join(FilePath,FileName)if os.path.isfile(FileAbsPath) == True:print("是文件",FileAbsPath)else:print("是目录",FileAbsPath)queue.append(FileAbsPath)
GetAllDirScope(path)

四,使用递归方式遍历

import os,collections
path = r'D:\test\work_file\meishi'def GetAllDir(path):FileList = os.listdir(path)for FileName in FileList:NewFileName = path + "\\" + FileNameprint("NewFileName =",NewFileName)if os.path.isdir(NewFileName):print("是目录")GetAllDir(NewFileName)else:print("是文件")
GetAllDir(path)

http://chatgpt.dhexx.cn/article/GvRJdNXT.shtml

相关文章

算法数据结构——图的遍历之深度优先搜索算法(Depth First Search)

1. 深度优先搜索简介 深度优先搜索算法(Depth First Search):英文缩写为 DFS。是一种用于搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。 深度优先搜索采用了回溯思想,该算法沿着树的深度遍历树的节…

【新书速递】实用安全多方计算导论

安全多方计算(MPC)是解决数据安全与隐私保护问题的关键安全数据交换技术,近年来发展迅速,但由于MPC涉及复杂的密码学和工程实现技术,行业长期缺乏同时具备MPC研究、应用和实现能力的综合性人才,这阻碍了MPC…

百万富翁问题--安全多方计算

百万富翁问题—安全多方计算 是由图灵奖获得者姚期智提出的。 有A、B两个富翁,A资产i亿元,B资产j亿元,i、j均在0-10范围内,在互不让对方知道自己资产的情况下,比较A和B的资产谁多谁少。 那么如何去比较呢?…

隐私保护技术之安全多方计算

安全多方计算(Secure Multi-Party Computation,SMPC)用于解决一组互不信任的参与方各自持有秘密数据, 协同计算一个既定函数的问题。安全多方计算在保证参与方获得正确计算结果的同时,无法获得计算结果之外的任何信息。 在整个计算过程中&…

基于同态加密体制的安全多方计算

本文首发公众号VenusBlockChain,关注公众号后可免费阅读!VenusBlockChain致力于区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。有兴趣的小伙伴们,欢迎关注。 安全多方计算(Secure Mu…

多方安全计算

说明,本文是转载的,个人觉得作者讲解清晰明了,收录用于学习,原文链接:https://blog.csdn.net/yuxinqingge/article/details/104588197。 如今,互联网已经完成了从IT时代向DT时代转变,数据已经成…

多方安全计算MPC

1.多方安全计算的价值 MPC是密码学的一个重要分支,旨在解决一组互不信任的参与方之间保护隐私的协同计算问题,为数据需求方提供不泄露原始数据前提下的多方协同计算能力。 在目前个人数据毫无隐私的环境下,对数据进行确权并实现数据价值显得…

安全多方计算(MPC)

MPC既适用于特定的算法,如加法、乘法、AES,集合交集等;也适用于所有可表示成计算过程的通用算法。 根据计算参与方个数不同,可分为只有两个参与方的2PC和多个参与方(≥3)的通用MPC 1)安全两方&a…

安全多方计算之二:一文搞懂百万富翁问题

百万富翁问题 1. 解决方案2. 协议描述3. 协议说明4. 协议举例5. 协议扩展 两个百万富翁Alice和Bob想知道他们两个谁更富有,但他们都不想让对方及其他第三方知道自己财富的任何信息,这是由中国计算机科学家、2000年图灵奖获得者姚启智教授于1982年在论文《…

安全多方计算-入门学习笔记(三)

四、基于非噪音的安全多方计算介绍 1概念 非噪音方法一般是通过密码学方法将数据编码或加密,得到一些奇怪的数字,而且这些奇怪的数字有一些神奇的性质,比如看上去很随机但其实保留了原始数据的线性关系,或者顺序明明被打乱但人们…

基于隐私保护的安全多方计算区块链融合技术的智能合约

安全多方计算与区块链的融合技术 SMPC-安全多方计算综述安全的定义安全模型SMPC效率问题 区块链应用:智能合约智能合约的问题SMPC需求引入 基于SMPC的智能合约辅助:MPI协议-效率提升 SMPC-安全多方计算综述 随着物联网、移动计算、大数据、云计算的快速…

安全多方计算之GMW协议

安全多方计算之GMW协议 一、背景 论文原文《How to play any mental game》。作者:Micali S, Goldreich O, Wigderson A. 发表在:Proceedings of the Nineteenth ACM Symp on Theory of Computing, STOC. GMW协议可以同时适用在布尔电路和算术电路&am…

多方安全计算概述

多方安全计算(Secure Multi-Party Computation, MPC)是密码学的一个分支,在无可信第三方的情况下,仍可安全地按照公开的计算逻辑,进行数据协同计算,并输出结果。 即使参与各方输入的数据只有自…

安全多方计算之一:什么是安全多方计算

安全多方计算 1. 安全多方计算简介2. 基本概念2.1 参与者2.2 攻击者 3. 安全多方计算的模型4. 安全多方计算的密码学工具5. 学习参考 1. 安全多方计算简介 安全多方计算问题SMC,Secure Multi-party Computation)由由中国计算机科学家、2000年图灵奖获得…

安全多方计算简介

文章目录 一、安全多方计算定义二、安全多方计算安全模型1.行为模型2.安全门限 三、安全多方计算关键技术1.秘密共享(Secret Sharing, SS)2.不经意传输(Oblivious Transfer, OT)3.混淆电路(Garbled Circuit, GC) 参考资料 一、安全多方计算定义 安全多方计算(Secure Multi-Par…

安全多方计算 # 个人笔记

一个优美令人如痴如醉的领域。 Data is the oil of the 21st century 欢迎读者拍砖和提供本文修改建议。本文长期维护。 第二次编辑于2021/10/20,新增了部分阅读材料,调整了文章内容的组织。 0 研究背景 【最后更新于2021/10/20】 时代背景&#xff1…

Verilog操作符

操作符优先级表 Verilog中的大小(size)与符号 Verilog根据表达式中变量的长度对表达式的值自动地进行调整; Verilog自动截断或扩展赋值语句中右边的值以适应左边变量的长度; 当一个负数赋值给无符号变量如reg时,Verilog自动完成二进制补码计算; 算术运算符 加(+)、减(-…

C语言——操作符详解

目录 一、算术操作符 二、移位操作符 三、位操作符 四、赋值操作符 五、单目操作符 六、关系操作符 七、逻辑操作符 八、条件操作符 九、逗号表达式 十、下标引用、函数调用和结构成员 以上就是C语言中涉及到得操作符,我将用代码实例配合说明&#xff0c…

教妹学Java(十一):操作符简介

大家好,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。本篇文章通过我和三妹对话的形式来谈一谈“Java 中的操作符”。 教妹学 Java,没见过这么有趣的标题吧?“语不惊人死不休”,没错&…

位运算操作符详解

文章目录 一. 移位操作符>> <<1. 整数的二进制表示Ps:怎么确定一个数在内存中占几位呢&#xff1f; 2. <<左移操作符3. >>右移操作符 二. 位操作符& &#xff5c;^1. &按&#xff08;二进制&#xff09;位与2. &#xff5c;按&#xff08;二进…