新闻中心

C++怎么实现深度优先搜索(DFS)_C++图与树的遍历算法详解

2025-11-23
浏览次数:
返回列表
深度优先搜索(DFS)通过递归或栈实现,先访问节点并标记,再深入未访问的邻接点,回溯时继续探索其他路径,适用于图和树的遍历。

c++怎么实现深度优先搜索(dfs)_c++图与树的遍历算法详解

深度优先搜索(DFS)是一种用于遍历或搜索图和树的算法。它的核心思想是沿着一条路径尽可能深入地访问节点,直到无法继续为止,然后回溯到上一个节点尝试其他路径。在C++中,可以通过递归或栈来实现DFS。下面详细介绍如何在图和树中实现DFS。

图的邻接表表示与DFS实现

在图中,通常使用邻接表来存储节点之间的连接关系。每个节点维护一个相邻节点的列表。

以下是一个无向图的DFS实现示例:

// 使用vector模拟邻接表 #include #include iostream> using namespace std;

class Graph { int V; // 节点数量 vector> adj; // 邻接表 void dfsUtil(int v, vector& visited);

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& visited) { visited[v] = true; cout

for (int neighbor : adj[v]) {
    if (!visited[neighbor]) {
        dfsUtil(neighbor, visited);
    }
}

}

void Graph::dfs(int start) { vector visited(V, false); dfsUtil(start, visited); }

说明:构造函数初始化邻接表;addEdge添加边;dfsUtil是递归辅助函数,打印当前节点并递归访问未访问的邻居;dfs启动遍历,初始化访问标记数组。

二叉树的DFS遍历

对于二叉树,DFS有三种常见顺序:前序、中序、后序。它们都可通过递归轻松实现。

PictoGraphic PictoGraphic

AI驱动的矢量插图库和插图生成平台

PictoGraphic 133 查看详情 PictoGraphic 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

递归本质是系统栈的调用,也可以手动用栈模拟,避免递归带来的栈溢出风险,尤其适用于深度较大的结构。

#include

void dfsIterative(Graph& g, int start) { int V = g.V; vector visited(V, false); stack s;

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&#215;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模块助你提升客户体验与销售效率 

搜索