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

BFS和DFS优先搜索算法

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

相关文章:

BFS和DFS优先搜索算法

1. BFS与DFS 1.1 BFS DFS即Depth First Search&#xff0c;深度优先搜索。它是一种图遍历算法&#xff0c;它从一个起始点开始&#xff0c;逐层扩展搜索范围&#xff0c;直到找到目标节点为止。 这种算法通常用于解决“最短路径”问题&#xff0c;比如在迷宫中找到从起点到终…...

python将两张图片对齐

目录 需要对齐的照片如下&#xff1a; 源码&#xff1a; 结果&#xff1a; 需要对齐的照片如下&#xff1a; 源码&#xff1a; import cv2 import numpy as np from matplotlib import pyplot as plt# 读取两张图片 imgA cv2.imread(./out/out/3.png) imgB cv2.imread(./…...

Linux修炼之路之初识操作系统+基础指令(1)

目录 引言 一&#xff1a;对操作系统(OS)的简单了解 1.操作系统(OS) 是什么 2.操作系统好坏的衡量标准 3.操作系统存在的重要性 4.理解所有在计算机上的操作 二&#xff1a;Linux与windows操作的特点区别 三&#xff1a;基础指令 1.ls 指令 1.使用 2.常用选项 2.…...

Flink中基于Chandy-Lamport算法的分布式快照实现详解

Apache Flink利用了一种基于Chandy-Lamport分布式快照算法的变体——异步屏障快照&#xff08;Asynchronous Barrier Snapshotting, ABS&#xff09;来实现其强大的容错机制。Chandy-Lamport算法最初由K.M. Chandy和Leslie Lamport于1985年提出&#xff0c;是一种用于分布式系统…...

软件3班20240513

java.util.PropertyResourceBundle4554617c package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) throws SQLException { // 获取属性配置文件ResourceBundle bundle Res…...

【小程序】怎么优化小程序的性能

优化小程序的性能是提高用户体验和确保应用顺畅运行的关键。以下是一些优化小程序性能的方法&#xff1a; 1. 代码优化2. 图片优化3. 网络请求优化4. 页面渲染优化5. 分包加载6. 使用性能分析工具7. 后端优化8. 用户体验优化 1. 代码优化 精简代码&#xff1a;删除不必要的代码…...

告别信用卡绑定烦恼:探索这个全功能的Azure语音替代品,包含AI视频制作!(微软Azure语音替代方案)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 语音合成的替代方案📝 功能特色📝 使用步骤示例⚓️ 相关链接 ⚓️📖 介绍 📖 虽然微软Azure语音服务为个人用户提供了充足的免费语音合成额度,但其注册过程中的信用卡绑定要求、繁琐的API配置步骤却…...

酷开科技依托酷开系统“硬件+内容”产业布局,抢占全球机遇!

2024年3月26日&#xff0c;创维集团发布了2023年年度业绩报告&#xff0c;去年全年实现了总营业额690.31亿元较上一年的534.91亿元整体营业额增长了29.1%。然而&#xff0c;值得注意的是&#xff0c;2023年度&#xff0c;创维集团智能家电业务的营收306.37亿元&#xff0c;较上…...

从离线到实时:无锡锡商银行基于 Apache Doris 的数据仓库演进实践

作者&#xff1a;武基鹏&#xff0c;无锡锡商银行 大数据技术经理 编辑整理&#xff1a;SelectDB 技术团队 导读&#xff1a;为实现数据资产的价值转化以及全面数字化、智能化的风险管理&#xff0c;无锡锡商银行大数据平台经历从 Hive 离线数据仓库到 Apache Doris 实时数据仓…...

网易云如何改ip地址到另外城市

在数字化时代&#xff0c;网络音乐平台已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会因为某些原因想要改变自己的IP地址&#xff0c;网易云音乐作为国内领先的音乐平台&#xff0c;其强大的功能和丰富的音乐资源吸引了大量用户。那么&#xff0c;…...

Golang 开发实战day13 - Reciver Functions

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 开发实战day13 - 接收…...

ZL-016D多通道小鼠主动跑轮系统主要研究动物生活节律

简单介绍&#xff1a; 多通道小鼠主动跑轮系统是由动物本身自发运动来推动跑轮转动。在这种构型中&#xff0c;笼内动物长期活动的信息&#xff0c;如跑轮转动方向、转数、累计总行程等&#xff0c;能够使用编码器进行长度计记录。此装置由转轮组件、笼体、以及转动方向速度传…...

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (九)

LlaMA 3 系列博客 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (四) 基于 LlaMA…...

计算机类的英语

Algorithm&#xff08;算法&#xff09;Binary code&#xff08;二进制代码&#xff09;Byte&#xff08;字节&#xff09;Cache&#xff08;缓存&#xff09;Database&#xff08;数据库&#xff09;Encryption&#xff08;加密&#xff09;Firewall&#xff08;防火墙&#x…...

深⼊理解指针(5)

目录 1. 回调函数是什么&#xff1f;1.1 使用回调函数修改 2. qsort使⽤举例2.1 使⽤qsort函数排序整型数2.2 使⽤qsort排序结构数据按年龄排序2.3 使⽤qsort排序结构数据按名字排序2.4整体代码 3. qsort函数的模拟实现3.1 整型数组的实现3.2 结构体按名字排序实现3.3 结构体按…...

baomidou dynamic-datasource 强制查询sql走主库

场景 因为引用了baomidou主从数据源&#xff0c;因为业务场景特殊&#xff0c;需要查询语句强制走主库&#xff0c;把解决方案分享出来&#xff0c;帮助大家少走弯路 pom依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-data…...

FPGA ov5640视频以太网传输

1 实验任务 使用DFZU4EV MPSoC 开发板及双目OV5640摄像头其中一个摄像头实现图像采集&#xff0c;并通过开发板上的以太网接口发送给上位机实时显示。 2 Verilog代码 2.1 顶层模块 timescale 1ns / 1ps //以太网传输视频顶层模块module ov5640_udp_pc (input sys_cl…...

论Java和C++方向选择

目录 1.难度2.就业压力3.岗位选择4.薪资待遇5.选择建议小结 1.难度 Java &#xff0c;C&#xff0c; 测开&#xff0c;整体来说三个方向难度相当。 1.仅从语法角度来看&#xff0c;c 是掌控一切&#xff0c;知识都要懂一点&#xff0c;而java的特点在于省心&#xff0c;都封装…...

交通灯-设计说明书

设计摘要&#xff1a; 本设计基于单片机技术&#xff0c;旨在实现智能化交通信号控制&#xff0c;并具备夜间模式、禁止通行模式、同行模式切换以及车流量监测功能。通过按键S1和S2实现夜间模式和禁止通行模式的切换&#xff0c;确保夜间交通安全和禁止通行的需要。按键S3和S4…...

[前端] vue2的/deep/转化为vue3语法(笔记)

vue2语法示例 <style scoped lang"less">::v-deep .el-carousel__button {width: 8px;height: 3px;border-radius: 3px;}::v-deep .el-carousel__indicator.is-active button {width: 16px;} } </style>在 Vue 3 中&#xff0c;/deep/ 或 >>> …...

Fast-GitHub:智能网络优化架构解析与分布式加速方案

Fast-GitHub&#xff1a;智能网络优化架构解析与分布式加速方案 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 在国内开发者面临G…...

CTF新手必看:用Python脚本搞定RSA常见攻击(附实战代码)

CTF密码学实战&#xff1a;Python脚本破解RSA五大攻击场景 在CTF竞赛中&#xff0c;RSA加密系统是最常见的密码学挑战之一。本文将带你深入实战&#xff0c;通过Python代码复现五种经典RSA攻击场景&#xff0c;从基础分解到高级数学技巧&#xff0c;每个案例都配有可直接运行的…...

空洞骑士模组管理革命:Scarab如何让复杂变简单?

空洞骑士模组管理革命&#xff1a;Scarab如何让复杂变简单&#xff1f; 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为空洞骑士模组安装而头疼吗&#xff1f;每次手动…...

告别手动Coding:用EB tresos Studio配置TC3xx芯片MCAL的保姆级图文指南

告别手动Coding&#xff1a;用EB tresos Studio配置TC3xx芯片MCAL的保姆级图文指南 当TC3xx系列芯片遇上AUTOSAR架构&#xff0c;传统寄存器级开发方式正在被图形化配置彻底革新。对于每天需要面对微控制器底层驱动的嵌入式工程师而言&#xff0c;EB tresos Studio提供的可视化…...

汇编新手避坑指南:搞懂AX、BX、CX、DX这些“双面”寄存器,才算入门

汇编新手避坑指南&#xff1a;搞懂AX、BX、CX、DX这些“双面”寄存器&#xff0c;才算入门 第一次接触汇编语言时&#xff0c;那些神秘的寄存器名称总让人望而生畏。尤其是AX、BX、CX、DX这几个"双面人"&#xff0c;一会儿能拆成AH和AL&#xff0c;一会儿又能合体使用…...

AI 写作一键生成超简单,焦圈儿免费积分福利等你来领

「现在写一篇公众号推文&#xff0c;没三四个小时都下不来。」一位做个人 IP 的朋友跟我抱怨。问题不在于工具太少&#xff0c;而在于门槛太高&#xff0c; 要么你得自己熬夜改稿&#xff0c;要么你得学一堆复杂 Prompt&#xff0c;才能把 AI 伺候好。内容行业正在进入一个悖论…...

告别‘Requirement already satisfied’:精准定位Python环境,让pip install不再迷茫

1. 为什么pip总是说"已经安装好了"&#xff1f; 每次看到"Requirement already satisfied"这个提示&#xff0c;我都想对着屏幕大喊&#xff1a;"不&#xff01;它根本没装在我想要的地方&#xff01;"这种抓狂的感觉&#xff0c;相信很多Python…...

从零部署SAM自动标注工具链:模型转换、交互标注与格式实战

1. 环境准备与项目部署 第一次接触SAM自动标注工具时&#xff0c;我被它强大的零样本分割能力震撼到了。这个由Meta开源的Segment Anything Model&#xff08;SAM&#xff09;确实改变了传统标注工作的游戏规则。下面我就带大家从零开始搭建整套工具链&#xff0c;过程中会分享…...

告别ActiveX!用WebSocket+JavaScript在Chrome/Firefox里直接调用扫描仪(附完整代码)

现代浏览器无插件扫描方案&#xff1a;WebSocket与JavaScript的完美结合 曾几何时&#xff0c;企业办公系统中扫描文档需要依赖特定的浏览器和插件。如今&#xff0c;随着技术演进&#xff0c;我们终于可以摆脱ActiveX和NPAPI的束缚&#xff0c;在Chrome、Firefox等现代浏览器中…...

UDP,TCP协议的格式与机制

目录 一&#xff1a;UDP 1.UDP协议端格式 2.UDP的特点 二&#xff1a;TCP 1.TCP协议段格式 2.确认应答机制 1.确认应答的原理 2.为什么有两个序号&#xff1f;——捎带应答 3.超时重传 4.快速重传 3.连接管理机制 1.三次握手 2.四次挥手 shutdown函数 COLSE_WAI…...