新闻中心

c++怎么实现深度优先搜索(DFS)_c++中DFS算法的递归与非递归实现

2025-11-04
浏览次数:
返回列表
深度优先搜索(DFS)可通过递归和非递归实现。递归法利用函数调用栈,代码简洁;非递归法使用显式栈避免栈溢出,适合深度大的图。两者时间复杂度均为O(V+E),空间复杂度O(V)。

c++怎么实现深度优先搜索(dfs)_c++中dfs算法的递归与非递归实现

深度优先搜索(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 Pippit AI

CapCut推出的AI创意内容生成工具

Pippit AI 133 查看详情 Pippit AI

思路: 使用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提高鼠标指针精确度选项 

搜索