深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索图或树的算法。它从起始节点开始,沿着一条路径尽可能深地探索,直到无法继续或达到目标节点,然后回溯到前一节点,继续探索其他路径,直到遍历完所有节点或找到目标。具体过程如下:

1、选择一个起始节点作为当前节点,并标记为已访问。

2、沿着当前节点的未访问邻居节点继续深入。

3、若存在未访问的邻居节点,则选择一个作为当前节点,标记为已访问,并重复步骤2。

4、若不存在未访问的邻居节点,则回溯到上一级节点。

5、重复步骤3和步骤4,直到所有节点都被访问过。

深度优先搜索可以使用递归或显式的栈数据结构来实现。下面是使用递归实现深度优先搜索的简化伪代码:

function DFS(node):if node is null:returnvisit(node)  // 访问当前节点mark node as visitedfor each neighbor of node:if neighbor is not visited:DFS(neighbor)  // 递归调用深度优先搜索

在深度优先搜索中,每个节点都会被访问且仅被访问一次。它通过递归地遍历每个节点的邻居节点来实现深度搜索。如果某个节点的邻居节点已经被访问过,那么该节点将被跳过。

深度优先搜索的应用广泛,例如在图论中用于寻找连通分量、拓扑排序、寻找路径等。在树的问题中,深度优先搜索可以用于查找树的特定节点或进行树的遍历。

需要注意的是,深度优先搜索可能会陷入无限循环,因此在应用时需要合理设置终止条件和避免重复访问节点。

以下是使用 C++ 实现深度优先搜索(DFS)二叉树的基本代码示例:

#include <iostream>
#include <stack>using namespace std;// 二叉树节点定义
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int value) : val(value), left(nullptr), right(nullptr) {}
};// 深度优先搜索函数
void DFS(TreeNode* root) {if (root == nullptr) {return;}stack<TreeNode*> s;s.push(root);while (!s.empty()) {TreeNode* current = s.top();s.pop();cout << current->val << " "; // 输出当前节点的值if (current->right) {s.push(current->right); // 将右子节点压入栈中}if (current->left) {s.push(current->left); // 将左子节点压入栈中}}
}int main() {// 构建二叉树TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);root->right->left = new TreeNode(6);root->right->right = new TreeNode(7);cout << "深度优先搜索结果:";DFS(root); // 执行深度优先搜索return 0;
}

运行以上代码的结果应该是输出深度优先搜索二叉树的节点值。由于二叉树的深度优先搜索的访问顺序是根节点、左子节点、右子节点,因此输出的结果应该是:

深度优先搜索结果:1 2 4 5 3 6 7

以下是使用深度优先搜索(Depth-First Search,DFS)算法在C++中遍历图的示例代码:

#include <iostream>
#include <vector>
#include <stack>class Graph {
private:int numVertices;          // 图中的节点数std::vector<int>* adjList;   // 邻接表public:// 构造函数Graph(int numVertices) : numVertices(numVertices) {adjList = new std::vector<int>[numVertices];}// 添加边void addEdge(int src, int dest) {adjList[src].push_back(dest);}// 深度优先搜索void DFS(int startVertex) {std::vector<bool> visited(numVertices, false);   // 标记节点是否被访问std::stack<int> stack;                           // 用于DFS的栈// 将起始节点入栈并标记为已访问stack.push(startVertex);visited[startVertex] = true;while (!stack.empty()) {int currentVertex = stack.top();stack.pop();std::cout << currentVertex << " ";// 遍历当前节点的相邻节点for (int neighbor : adjList[currentVertex]) {if (!visited[neighbor]) {stack.push(neighbor);visited[neighbor] = true;}}}}// 析构函数,释放内存~Graph() {delete[] adjList;}
};int main() {// 创建一个包含5个节点的图Graph graph(5);// 添加边graph.addEdge(0, 1);graph.addEdge(0, 2);graph.addEdge(1, 3);graph.addEdge(2, 3);graph.addEdge(2, 4);graph.addEdge(3, 4);// 从节点0开始进行深度优先搜索std::cout << "深度优先搜索结果: ";graph.DFS(0);std::cout << std::endl;return 0;
}

在上述代码中,我们定义了一个Graph类来表示图。使用邻接表作为内部数据结构,使用std::vector<int>* adjList来存储图的邻接表,其中每个向量表示节点的相邻节点列表。

addEdge函数用于向图中添加边,它将目标节点添加到源节点的相邻节点列表中。

DFS函数实现了深度优先搜索算法。它使用一个栈来辅助进行搜索,通过迭代的方式遍历图中的节点。首先,将起始节点入栈并标记为已访问。然后,从栈中弹出当前节点,并访问该节点。接着,遍历当前节点的相邻节点,并将未访问过的相邻节点入栈。不断重复这个过程,直到栈为空。

输出结果为:

深度优先搜索结果: 0 2 4 3 1

C++——深度优先搜索相关推荐

  1. [C] 深度优先搜索解决连通块/染色问题——求岛的个数

    本文介绍用DFS解决连通块个数问题 有关dfs的介绍见另外一篇:不撞南墙不回头--深度优先搜索 例题 宝岛探险 题目描述 一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示 ...

  2. 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索

    0基础学算法 搜索篇第一讲 深度优先搜索 相信绝大多数人对于深度优先搜索和广度优先搜索是不会特别陌生的,如果我这样说似乎你没听说过,那如果我说dfs和bfs呢?先不说是否学习过它们,至少它们的大名应该 ...

  3. leetcode dfs_深度优先搜索:具有6个Leetcode示例的DFS图遍历指南

    leetcode dfs Have you ever solved a real-life maze? The approach that most of us take while solving ...

  4. 【ACM】杭电OJ 1241(深度优先搜索小结)

    题目链接:杭电OJ 1241 深度优先搜索问题 深度优先搜索是搜索的手段之一.它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解. ...

  5. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  6. c++输出方块_C/C++编程笔记:DFS 深度优先搜索的基本思想,含实例讲解

    采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新 ...

  7. networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...

    在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...

  8. 优先深度搜索判断曲线相交_程序员必知的十大基础实用算法之-DFS(深度优先搜索)...

    深度优先搜索 深度优先搜索是一种在开发爬虫早期使用较多的方法.它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) .在一个HTML文件中,当一个超链被选择后,被链接的HTML文件 ...

  9. 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...

    度:某个顶点的度就是依附于该顶点的边的个数 子图:一幅图中所有边(包含依附边的顶点)的子集 路径:是由边顺序连接的一系列定点组成 环:至少含有一条边且终点和起点相同的路径 连通图:如果图中任一个到另一 ...

  10. DFS(深度优先搜索)

    深度优先搜索算法(Depth-First-Search),是搜索算法的一种.它沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点. ...

最新文章

  1. 几何画板对象标签的几个疑问
  2. 开源,是一种新的平台之战
  3. BZOJ 1406 密码箱(数论)
  4. CF293B Distinct Paths题解
  5. 网络发展的模式之一:新功能在应用系统涌现,然后逐渐迁移到基础设施
  6. linux 好用的命令积累
  7. html5 canvas系列教程-像素操作(反色,黑白,亮度,复古,蒙版,透明)
  8. 3.Java 面试题整理(线程篇)
  9. leetcode题解162-寻找峰值
  10. CodeSmith 基础教程
  11. ICC2(二)place —— congestion
  12. 网站死链接检测与完美处理方法
  13. 大数据核心技术是什么?
  14. android时间格式am pm,pm时间(am.pm正确时间书写格式)
  15. AR智能隐形眼镜市场前景动态及发展规划建议报告2022-2028年版
  16. 联想G40-70固态安装教程(实际操作经验)
  17. mysql数据库数据类型_MySQL-数据类型
  18. 在Linux中压缩/解压缩文件
  19. 【英语竞赛】专项练习之翻译
  20. 美国正在搞一场大规模人工智能大赛,主办方是情报研究计划局

热门文章

  1. SpringBoot项目中集成第三方登录功能
  2. Shazam原理分析
  3. H264编码一些名词概念和疑问
  4. 搭建商城系统,多种系统源码的区别
  5. 网络数据包片段拼合(连续h264片段拼接成完整h264 slice)(三)循环体移到外部调用,便于调用者控制
  6. 一条SQL语句计算出商品剩余库存数量
  7. 孟岩《通证经济系统设计》三期8.18开课,四期正式接受报名!
  8. 让SDK成为云剪辑的“翅膀”——专访美摄研发中心总监李磊
  9. 千锋教育实训day07————java
  10. 动态加载图片,实现瀑布流效果