BFS和DFS优先搜索算法

news2024/9/22 18:29:54

1. BFS与DFS

1.1 BFS

DFS即Depth First Search,深度优先搜索。它是一种图遍历算法,它从一个起始点开始,逐层扩展搜索范围,直到找到目标节点为止。

这种算法通常用于解决“最短路径”问题,比如在迷宫中找到从起点到终点的最短路径

  • 首先,从起点开始,检查所有与它相邻的位置,也就是距离起点为1的位置
  • 然后,继续向外扩展,检查所有距离起点为2的位置,以此类推,直到找到出口
    在这里插入图片描述

我们发现每次搜索的位置都是距离当前节点最近的点。因此,BFS是具有最短路的性质的。在BFS中,可以使用队列来存储待搜索的节点。起始点首先加入队列中,然后不断从队列中取出节点,检查它是否是目标节点。如果不是,就将它的所有未被访问过的邻居加入队列中。这样,队列中的节点总是按照它们距离起点的距离排序,先加入队列的节点总是先被取出来搜索

通过这种方式,BFS可以找到起点到目标节点的最短路径。在实际应用中,BFS还可以用于拓扑排序、连通性检测等问题的解决。

1.2 DFS

DFSDepth First Search,深度优先搜索。它从一个起始点开始,一直往下走直到不能再走为止(简单理解:一条路走到黑),然后返回到前一个节点继续探索它的其他分支,直到找到目标节点为止。这种算法通常用于解决“遍历”问题,比如在树中查找所有的叶子节点

要理解DFS,也还可以想象自己在迷宫中寻找所有可行的路径

  • 首先,你会从起点开始,顺着一条路一直走,直到你走到一个死胡同
  • 再返回到前一个节点,继续探索其他分支

在DFS中,你可以使用递归或栈来实现深度优先搜索。通过这种方式,DFS可以找到所有可行的路径,或者在树中查找所有的叶子节点。

在实际应用中,DFS还可以用于拓扑排序、连通性检测等问题的解决。与BFS相比,DFS通常更适合处理深度优先的问题,而BFS更适合处理广度优先的问题

1.3 BFS与DFS的比较

如果分别用DFS 与 BFS 将二叉树的所有结点遍历一遍,那么它们遍历结点的顺序分别如下所示


接下来,让我们先看看在二叉树上进行 BFS 遍历和 DFS 遍历的代码比较

(1)DFS 使用递归遍历

void dfs(TreeNode* root) 
{
    if (root == nullptr) 
    {
        return;
    }
    // 依次递归遍历它的左子树和右子树
    dfs(root->left);
    dfs(root->right);
}

(2)BFS 遍历使用队列相关的数据结构

void bfs(TreeNode* root) 
{
    // 创建一个队列
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) 
    {
        // 在每次循环中,使用 q.front() 获取队头节点,并将其出队
        TreeNode* node = q.front();
        q.pop();
 		
 		// 然后将下一层的节点加入队列中
        // 检查这个节点的左右子节点是否为空,如果不为空,就将它们加入队列中
        if (node->left != nullptr) 
        {
            q.push(node->left);
        }
        if (node->right != nullptr)
        {
            q.push(node->right);
        }
    }
}

参考博客: https://blog.csdn.net/v_JULY_v/article/details/6111353

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

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

相关文章

若依微服务docker-compose 启动

docker-compose 文件 version : 3 services: ruoyi-nacos: container_name: ruoyi-nacos image: nacos/nacos-server build: context: ./nacos environment: - MODEstandalone volumes: - ./nacos/logs/:/home/nacos/logs - ./n…

SpringBoot+MybatisPlus实现读写分离,自动切换数据源

读写分离有必要吗&#xff1f; 实现读写分离势必要与你所做的项目相关&#xff0c;如果项目读多写少&#xff0c;那就可以设置读写分离&#xff0c;让“读”可以更快&#xff0c;因为你可以把你的“读”数据库的innodb设置为MyISAM引擎&#xff0c;让MySQL处理速度更快。 实现…

python turtle 升国旗

​一、导语 大家好,前段时间,我们画出了五星红旗,今天我们要用Python的Turtle库来绘制一个五星红旗,并让国旗上升,让我们一起来感受编程与艺术的完美结合吧!领略国家的强大!爱祖国,做一个遵纪守法的好公民。 二、效果展示 升国旗 三、开发过程 一、准备工作 首先我们…

品牌银饰售卖|基于SSM+vue的品牌银饰售卖平台的设计与实现(源码+数据库+文档)

品牌银饰售卖平台 目录 基于SSM&#xff0b;vue的品牌银饰售卖平台的设计与实现 一、前言 二、系统设计 三、系统功能设计 1前台功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

怎么扫码查看文件内容?多文件一键生成二维码的方法

现在日常生活中经常会看到很多的二维码中包含文件&#xff0c;扫码后在手机上预览文件内容或者下载文件&#xff0c;有很多的应用场景下被使用。通过扫描二维码的方式实现文件的传递&#xff0c;与传统方式相比更加方便快捷。 这种方式能够提升获取文件的便捷性&#xff0c;而…

在大型项目上,Python 是个烂语言吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Python的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; python项目超过5万行&#x…

谷粒商城实战(024 业务-订单模块-分布式事务1)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第284p-第p290的内容 简介 模拟积分服务出异常&#xff0c;前方的锁库存事务未回滚&#xff0c;这时候就需要分布式事务 本地事务 事务的隔离…

echarts 环形图实现透明间隔,嵌套环形图片和图形

echarts 环形图实现透明间隔&#xff0c;嵌套环形图片和图形 环形图实现透明间隔环形图嵌套环形图片环形图嵌套环形图形 环形图实现透明间隔 首先通过 radius 属性实现一个圆环图 再通过 padAngle 属性设置扇区角度即可 使用 borderRadius 属性设置扇形区块的内外圆角半径&…

新时代高速数据中心800G DR8光模块解决方案

近年来&#xff0c;随着5G网络、存储介质和计算能力等基础技术的不断升级&#xff0c;100G和400G数据中心得到了普及。如今800G数据中心时代也已经来临。本文将围绕800G DR8来介绍飞速&#xff08;FS&#xff09;800G数据中心解决方案&#xff0c;旨在为全球客户提供全面且高性…

如何在阿里云申请免费SSL证书(三个月有效)

SSL证书主要用于建立Web服务器和客户端间可信的HTTPS协议加密链接&#xff0c;以防止数据在传输过程中被篡改&#xff0c;避免信息泄露。阿里云提供了多种品牌和类型的SSL证书&#xff0c;以满足不同用户的需求。您可以根据自己的预算、域名类型以及网站类型&#xff0c;选择购…

【Qt】按钮类控件(二)

文章目录 按钮类控件1、Push Button代码示例: 带有图标的按钮代码示例: 带有快捷键的按钮 2、Radio Buttion代码示例: click, press, release, toggled 的区别代码示例: 单选框分组&#xff08;QButtonGroup&#xff09; 3、 Check Box代码示例: 获取复选按钮的取值 按钮类控件…

Cow Exhibition G的来龙去脉

[USACO03FALL] Cow Exhibition G - 洛谷 曲折经过 爆搜 一开始没什么好的想法&#xff0c;就针对每头奶牛去or不去进行了爆搜。 #include <cstdio> #include <algorithm> using namespace std;#define maxn 405 int iq[maxn], eq[maxn]; int ans; int n;void d…

C++系统编程篇——Linux初识(系统安装、权限管理,权限设置)

(1)linux系统的安装 双系统---不推荐虚拟机centos镜像&#xff08;可以使用&#xff09;云服务器/轻量级云服务器&#xff08;强烈推荐&#xff09; ①云服务器&#xff08;用xshell连接&#xff09; ssh root公网IP 然后输入password ①添加用户&#xff1a; addus…

企业研发必备网络:这些关键特性,你get了吗?

对于以研发为核心的企业&#xff0c;如软件开发、生物制药、智能汽车等&#xff0c;安全、稳定的研发网络可是他们业务发展不可或缺的。那么&#xff0c;这些研发网络究竟有哪些独特之处&#xff0c;又能为企业带来哪些价值呢&#xff1f; 首先&#xff0c;我们知道企业研发常常…

【设计模式】JAVA Design Patterns——Adapter(适配器模式)

&#x1f50d;目的 将一个接口转换成另一个客户所期望的接口。适配器让那些本来因为接口不兼容的类可以合作无间。 &#x1f50d;解释 现实世界例子 考虑有这么一种情况&#xff0c;在你的存储卡中有一些照片&#xff0c;你想将其传到你的电脑中。为了传送数据&#xff0c;你需…

【管理咨询宝藏104】普华永道财务管理与内控培训

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏104】普华永道财务管理与内控培训 【格式】PDF版本 【关键词】普华永道、四大、财务管理 【核心观点】 - 职能转变后&#xff0c;财务在决策支持…

「前端」性能优化问题总结

前言 本文主要介绍一些前端通用的性能优化方案总结&#xff0c;非写代码阶段的性能优化。 分包 React router V6.4 数据路由新特性 <Route path/xx lazy{async()>{const module await import(./xx)const XX module.defaultreturn{element:(<Suspense fallback…

紫光展锐先进技术科普 | 工业互联网遇到5G,1+1>2?

随着工厂自动化的加速普及&#xff0c;如今我们可能经常看到这样的场景&#xff1a;在高温、潮湿、粉尘、腐蚀等恶劣环境作业场景&#xff0c;巡检机器人穿梭其中&#xff0c;工人们不必弯腰去搬沉重又危险的器件&#xff0c;而旁边会有一个个机械臂帮手平稳有序地完成好所有搬…

HTTP客户端手动解析响应体数据

服务端 package mainimport ("easyGo/person""encoding/json""net/http" )func main() {http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {p : &person.Person{Name: "jackie",Age: 30,T: pe…

【JAVA进阶篇教学】第十六篇:Java中AOP使用

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十五篇&#xff1a;Java中AOP使用。 AOP&#xff08;Aspect-Oriented Programming&#xff09;是一种编程范式&#xff0c;它允许开发者在不修改源代码的情况下&#xff0c;对代码进行横切关注点的分离和增强。在 Java…