新闻中心
C++怎么实现深度优先搜索(DFS)_C++图与树的遍历算法详解
深度优先搜索(DFS)通过递归或栈实现,先访问节点并标记,再深入未访问的邻接点,回溯时继续探索其他路径,适用于图和树的遍历。

深度优先搜索(DFS)是一种用于遍历或搜索图和树的算法。它的核心思想是沿着一条路径尽可能深入地访问节点,直到无法继续为止,然后回溯到上一个节点尝试其他路径。在C++中,可以通过递归或栈来实现DFS。下面详细介绍如何在图和树中实现DFS。
图的邻接表表示与DFS实现
在图中,通常使用邻接表来存储节点之间的连接关系。每个节点维护一个相邻节点的列表。
以下是一个无向图的DFS实现示例:
// 使用vector模拟邻接表 #includeclass Graph {
int V; // 节点数量
vector
public: Graph(int V); void addEdge(int v, int w); void dfs(int start); };
Graph::Graph(int V) { this->V = V; adj.resize(V); }
void Graph::addEdge(int v, int w) { adj[v].push_back(w); adj[w].push_back(v); // 无向图双向添加 }
void Graph::dfsUtil(int v, vector } void Graph::dfs(int start) {
vectorfor (int neighbor : adj[v]) {
if (!visited[neighbor]) {
dfsUtil(neighbor, visited);
}
}
说明:构造函数初始化邻接表;addEdge添加边;dfsUtil是递归辅助函数,打印当前节点并递归访问未访问的邻居;dfs启动遍历,初始化访问标记数组。
二叉树的DFS遍历
对于二叉树,DFS有三种常见顺序:前序、中序、后序。它们都可通过递归轻松实现。
PictoGraphic
AI驱动的矢量插图库和插图生成平台
133
查看详情
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 前序遍历:根 -> 左 -> 右 void preorder(TreeNode* root) { if (root == nullptr) return; cout val left); preorder(root->right); }
// 中序遍历:左 -> 根 -> 右 void inorder(TreeNode* root) { if (root == nullptr) return; inorder(root->left); cout val right); }
// 后序遍历:左 -> 右 -> 根 void postorder(TreeNode* root) { if (root == nullptr) return; postorder(root->left); postorder(root->right); cout val
每种遍历
方式只是处理根节点的位置不同,其余结构一致。可根据需求选择合适顺序。
使用栈实现非递归DFS
递归本质是系统栈的调用,也可以手动用栈模拟,避免递归带来的栈溢出风险,尤其适用于深度较大的结构。
#includevoid dfsIterative(Graph& g, int start) {
int V = g.V;
vector
s.push(start);
while (!s.empty()) {
int v = s.top();
s.pop();
if (!visited[v]) {
cout << v << " ";
visited[v] = true;
}
// 将所有未访问的邻接点压入栈(注意顺序可影响输出)
for (auto it = g.adj[v].rbegin(); it != g.adj[v].rend(); ++it) {
if (!visited[*it]) {
s.push(*it);
}
}
}}
使用栈时要注意:为了保证与递归顺序一致,通常需要逆序压入邻接点。因为栈是后进先出,先压入右边会导致左边先被访问。
基本上就这些。无论是图还是树,DFS的核心就是“一路走到底,走不通再回头”。递归写法简洁直观,适合大多数场景;非递归则更灵活可控。理解访问标记数组的作用和回溯时机是掌握DFS的关键。
以上就是C++怎么实现深度优先搜索(DFS)_C++图与树的遍历算法详解的详细内容,更多请关注其它相关文章!
# edge
# 新乡做推广网站
# 武汉网站建设企业排名
# 哈尔滨抖音seo哪家好
# 哪些公司可以建设网站
# 商丘正规网站建设企业
# 甘孜网站建设推广外包
# 可以通过
# 相关文章
# 二叉树
# 是一种
# 与其他
# 是一个
# 如何使用
# 适用于
# 遍历
# 递归
# stream
# ios
# c++
# 栈
# node
# 网络营销与推广实施步骤
# 烟台外贸网站优化公司
# 池州营销推广哪家好
# 做优化网站的有用吗
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
C++指针和引用有什么区别_C++内存管理核心概念深度解析
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
红果短剧网页版官网入口 官方最新网址发布
Fabric模组开发:自定义物品与物品组的现代管理方法
Golang如何实现状态模式管理对象状态_Golang State模式实现技巧
微信网页版扫码登录入口 微信网页版二维码登录入口
HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
Go语言JSON解析深度指南:动态访问与结构体映射实践
苹果手机如何防止被恶意App追踪
mc.js官网登录入口 mc.js官方登录入口最新版
大象笔记网页版入口 印象笔记网页版登录入口
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
Lar*el DB::listen 事件中的查询执行时间单位解析
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
AO3官方在线访问地址 Archive of Our Own最新镜像合集
Django模型中自动计算可用余额的实现方法
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版
J*aScript数组对象转换:按指定键分组与值收集
在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全
Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
J*aScript教程:根据元素文本内容动态设置背景色
Kafka Streams中基于消息头条件过滤消息的实现指南
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
Shopware订单对象中获取产品自定义字段的正确方法
荣耀Play7T运行卡顿解决_荣耀Play7T性能优化
2026年CSGO开箱网站推荐 CSGO开箱平台精选
支付宝如何设置安全保护_支付宝安全设置的全面教程
J*aScriptWebpack优化_J*aScript构建工具实战
如何有效阻止外部脚本意外修改内联样式的高度属性
J*a编写用户注册与登录功能_掌握字符串与验证逻辑
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
word中如何让数字纵向排列_Word数字纵向排列方法
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
解决移动端滚动问题的overflow属性应用指南
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题
拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率


2025-11-23
浏览次数:次
返回列表