新闻中心
c++怎么实现深度优先搜索(DFS)_c++中DFS算法的递归与非递归实现
深度优先搜索(DFS)可通过递归和非递归实现。递归法利用函数调用栈,代码简洁;非递归法使用显式栈避免栈溢出,适合深度大的图。两者时间复杂度均为O(V+E),空间复杂度O(V)。

深度优先搜索(DFS)是一种用于遍历或搜索图或树的算法。在C++中,DFS可以通过递归和非递归两种方式实现。下面分别介绍这两种方法,并给出具体代码示例。
递归实现DFS
递归是最直观、最常用的DFS实现方式。它利用函数调用栈自动保存访问路径。
思路: 从起始节点开始,标记为已访问,然后对每个未访问的邻接节点递归调用DFS。
- 使用一个布尔数组记录节点是否被访问过
- 用邻接表存储图结构(如vector
>) - 递归进入每一个未访问的相邻节点
代码示例:
#include <iostream> #include <vector> using namespace std; void dfs_recursive(const vector<vector<int>>& graph, vector<bool>& visited, int node) { visited[node] = true; cout << node << " "; for (int neighbor : graph[node]) { if (!visited[neighbor]) { dfs_recursive(graph, visited, neighbor); } } } int main() { int n = 5; // 节点数 vector<vector<int>> graph(n); vector<bool> visited(n, false); // 构建图:0-1, 0-2, 1-3, 1-4 graph[0] = {1, 2}; graph[1] = {3, 4}; graph[2] = {}; graph[3] = {}; graph[4] = {}; cout << "递归DFS: "; dfs_recursive(graph, visited, 0); cout << endl; return 0; }
非递归实现DFS
非递归版本使用显式的栈(stack)来模拟函数调用过程,避免递归带来的栈溢出风险,尤其适用于深度很大的图。
Pippit AI
CapCut推出的AI创意内容生成工具
133
查看详情
思路: 使用STL中的stack保存待访问的节点。每次取出栈顶,标记访问,并将其未访问的邻居压入栈中。
- 手动维护一个栈结构
- 先访问当前节点,再将邻居逆序入栈(保证顺序一致)
- 注意入栈前判断是否已访问,避免重复处理
代码示例:
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
void dfs_iterative(const vector<vector<int>>& graph, int start) {
int n = graph.size();
vector<bool> visited(n, false);
stack<int> stk;
stk.push(start);
while (!stk.empty()) {
int node = stk.top();
stk.pop();
if (visited[node]) continue;
visited[node] = true;
cout << node << " ";
// 逆序压入邻居,确保先访问编号小的节点
for (auto it = graph[node].rbegin(); it != graph[node].rend(); ++it) {
if (!visited[*it]) {
stk.push(*it);
}
}
}
}
int main() {
int n = 5;
vector<vector<int>> graph(n);
graph[0] = {1, 2};
graph[1] = {3, 4};
graph[2] = {};
graph[3] = {};
graph[4] = {};
cout << "非递归DFS: ";
dfs_iterative(graph, 0);
cout << endl;
return 0;
}
两种方式对比
递归写法简洁易懂,适合大多数场景;非递归写法控制力更强,适合大深度图或防止栈溢出。
- 递归依赖系统调用栈,可能栈溢出
- 非递归使用堆内存的stack,更稳定
- 非递归需要手动管理访问顺序和入栈方向
- 两者时间复杂度均为O(V + E),空间复杂度O(V)
以上就是c++++怎么实现深度优先搜索(DFS)_c++中DFS算法的递归与非递归实现的详细内容,更多请关注其它相关文章!
# 是一种
# 珠海网站建设网站优化
# 重庆市婚庆网站建设
# 重庆seo推广方式
# 直通车关键词的平均排名
# 新洲网站优化公司
# 雅安市整合营销推广
# 抖音seo操作入口
# 盘锦网站推广服务
# 桂林抖音SEO运营
# 江苏市场营销策划推广
# 适用于
# 遍历
# node
# 与其他
# 法利
# 如何使用
# 均为
# 两种
# 与非
# 递归
# stream
# ios
# c++
# ai
# 栈
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
J*aScript:在map操作中高效处理空数组
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
VS Code远程开发时如何处理文件权限问题
Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式
抖音网页版快捷访问 抖音网页版网页版入口操作教程
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
深入理解J*a编译器的兼容性选项:从-source到--release
Go语言HTML解析:利用Goquery精准获取指定元素内容
最新韩小圈网页版登录入口_官网在线观看官方链接
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
Pygame教程:解决用户输入与游戏状态更新不同步问题
AO3最新镜像入口 Archive of Our Own官方平台访问
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
Eclipse怎么运行工程_Eclipse工程运行配置说明
J*aScript中正确使用querySelectorAll与复杂CSS选择器
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问
在命令行怎么运行html项目_命令行运行html项目方法【教程】
zookeeper 都有哪些功能?
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗
知音漫客正版漫画平台_知音漫客官网账号登录
谷歌google账号怎么注册账号 谷歌账号注册官方流程
outlook中文官网入口地址 outlook官方中文版直达首页链接
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
照顾宝贝2小游戏点击立即在线玩
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
React项目中导航栏Logo自适应布局:避免裁剪与布局溢出
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示
如何仅使用CSS更改登录界面背景图像图标的颜色
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
基于动态规划的房屋花卉种植最小成本算法详解
微信群消息显示延迟如何解决 微信群消息刷新优化方法
顺丰国际快递查询 国际件官方查询入口
Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项


2025-11-04
浏览次数:次
返回列表
;& graph, vector<bool>& visited, int node) {
visited[node] = true;
cout << node << " ";
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
dfs_recursive(graph, visited, neighbor);
}
}
}
int main() {
int n = 5; // 节点数
vector<vector<int>> graph(n);
vector<bool> visited(n, false);
// 构建图:0-1, 0-2, 1-3, 1-4
graph[0] = {1, 2};
graph[1] = {3, 4};
graph[2] = {};
graph[3] = {};
graph[4] = {};
cout << "递归DFS: ";
dfs_recursive(graph, visited, 0);
cout << endl;
return 0;
}