讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋枫姑娘_1888

秋枫姑娘_1888

发布时间:2025-11-23 16:09:06

|

993人浏览过

|

来源于php中文网

原创

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

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

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

图的邻接表表示与DFS实现

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

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

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

class Graph { int V; // 节点数量 vector<vector<int>> adj; // 邻接表 void dfsUtil(int v, vector<bool>& 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<bool>& visited) { visited[v] = true; cout << v << " ";

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

}

立即学习“C++免费学习笔记(深入)”;

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

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

飞书发语音(edge)
飞书发语音(edge)

飞书语音消息发送器。基于 Edge TTS,一键将文字转为语音发送到飞书。 使用场景: - 发送语音通知/提醒到飞书 - 文字转语音自动播报 触发词:飞书语音、语音发送、tts、文字转语音

下载

二叉树的DFS遍历

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

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 << root->val << " "; preorder(root->left); preorder(root->right); }

// 中序遍历:左 -> 根 -> 右 void inorder(TreeNode* root) { if (root == nullptr) return; inorder(root->left); cout << root->val << " "; inorder(root->right); }

// 后序遍历:左 -> 右 -> 根 void postorder(TreeNode* root) { if (root == nullptr) return; postorder(root->left); postorder(root->right); cout << root->val << " "; }

每种遍历方式只是处理根节点的位置不同,其余结构一致。可根据需求选择合适顺序。

使用栈实现非递归DFS

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

#include <stack>

void dfsIterative(Graph& g, int start) { int V = g.V; vector<bool> visited(V, false); stack<int> 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的关键。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5239

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2665

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3268

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2325

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

616

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

351

2025.11.27

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

4667

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2128

2023.08.10

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 10.6万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 27.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn