C++——深度优先搜索
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索图或树的算法。它从起始节点开始,沿着一条路径尽可能深地探索,直到无法继续或达到目标节点,然后回溯到前一节点,继续探索其他路径,直到遍历完所有节点或找到目标。具体过程如下:
1、选择一个起始节点作为当前节点,并标记为已访问。
2、沿着当前节点的未访问邻居节点继续深入。
3、若存在未访问的邻居节点,则选择一个作为当前节点,标记为已访问,并重复步骤2。
4、若不存在未访问的邻居节点,则回溯到上一级节点。
5、重复步骤3和步骤4,直到所有节点都被访问过。
深度优先搜索可以使用递归或显式的栈数据结构来实现。下面是使用递归实现深度优先搜索的简化伪代码:
-
function DFS(node):
-
if node is null:
-
return
-
-
visit(node) // 访问当前节点
-
-
mark node as visited
-
-
for each neighbor of node:
-
if neighbor is not visited:
-
DFS(neighbor) // 递归调用深度优先搜索
在深度优先搜索中,每个节点都会被访问且仅被访问一次。它通过递归地遍历每个节点的邻居节点来实现深度搜索。如果某个节点的邻居节点已经被访问过,那么该节点将被跳过。
深度优先搜索的应用广泛,例如在图论中用于寻找连通分量、拓扑排序、寻找路径等。在树的问题中,深度优先搜索可以用于查找树的特定节点或进行树的遍历。
需要注意的是,深度优先搜索可能会陷入无限循环,因此在应用时需要合理设置终止条件和避免重复访问节点。
以下是使用 C 实现深度优先搜索(DFS)二叉树的基本代码示例:
-
-
-
-
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 中遍历图的示例代码:
-
-
-
-
-
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
这篇文章转载于:学新通
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通
- 本文地址: https://www.swvq.com/boutique/detail/tanhfaeifb
- 联系方式: luke.wu●vfv.cc
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
抖音国际版要用什么加速器能流畅刷Tiktok的加速器
TK小达人 08-02 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14