c++实现深度优先遍历

本文将介绍如何使用C++实现图的深度遍历算法。深度遍历是一种从某个顶点出发,沿着图的边访问尽可能多的顶点的方法,如果到达某个顶点后没有未访问的相邻顶点,就回溯到上一个顶点,继续访问其他相邻顶点,直到所有顶点都被访问过为止。深度遍历可以用递归或栈来实现。
var code = “996ed723-1b61-456f-8518-93e9f81b98db”
假设我们有如下图:

我们可以用邻接表来存储这个图,邻接表是一个数组,每个元素是一个链表,表示一个顶点及其相邻的顶点。例如,下面是图1e的邻接表:

我们可以定义如下结构体来表示邻接表中的节点:

// 邻接表节点
struct AdjNode {
int v; // 顶点编号
AdjNode* next; // 指向下一个节点的指针
AdjNode(int v): v(v), next(nullptr) {} // 构造函数
};

// 邻接表头节点
struct AdjList {
char data; // 顶点数据
AdjNode* head; // 指向第一个邻接节点的指针
AdjList(char data): data(data), head(nullptr) {} // 构造函数
};

然后,我们可以定义一个类来表示图,包含邻接表数组和顶点数:

// 图类
class Graph {
private:
int n; // 顶点数
AdjList* adjList[MAX]; // 邻接表数组
public:
Graph(int n); // 构造函数,初始化图
void addEdge(int u, int v); // 添加一条边(u, v)
void DFS(int v); // 从顶点v开始深度遍历
void DFS(); // 深度遍历整个图
};

构造函数和添加边的函数如下:

// 构造函数,初始化图
Graph::Graph(int n) {
this->n = n; // 设置顶点数
for (int i = 0; i < n; i++) {
adjList[i] = new AdjList('a' + i); // 创建头节点,设置顶点数据为字母a~f
}
}

// 添加一条边(u, v)
void Graph::addEdge(int u, int v) {
AdjNode* node = new AdjNode(v); // 创建一个邻接节点
node->next = adjList[u]->head; // 将节点插入到u的链表头部
adjList[u]->head = node; // 更新u的链表头指针
}

深度遍历的函数如下:

// 从顶点v开始深度遍历
void Graph::DFS(int v) {
bool visited[MAX] = {false}; // 定义一个访问标记数组,初始化为false
DFS(v, visited); // 调用递归函数
}

// 递归函数,从顶点v开始深度遍历,visited记录已访问的顶点
void Graph::DFS(int v, bool visited[]) {
cout << adjList[v]->data << " "; // 输出当前顶点数据
visited[v] = true; // 标记当前顶点已访问
AdjNode* p = adjList[v]->head; // 获取当前顶点的邻接链表头指针
while (p != nullptr) { // 遍历邻接链表
int w = p->v; // 获取邻接顶点编号
if (!visited[w]) { // 如果邻接顶点未访问过,递归访问它
DFS(w, visited);
}
p = p->next; // 指向下一个邻接节点
}
}

// 深度遍历整个图
void Graph::DFS() {
bool visited[MAX] = {false}; // 定义一个访问标记数组,初始化为false
for (int i = 0; i < n; i++) { // 遍历所有顶点
if (!visited[i]) { // 如果顶点未访问过,从它开始深度遍历
DFS(i, visited);
}
}
}

最后,我们可以在主函数中创建一个图对象,添加边,然后调用深度遍历的函数:

int main() {
Graph g(6); // 创建一个有6个顶点的图
g.addEdge(0, 1); // 添加边(a, b)
g.addEdge(0, 2); // 添加边(a, c)
g.addEdge(1, 3); // 添加边(b, d)
g.addEdge(1, 4); // 添加边(b, e)
g.addEdge(2, 4); // 添加边(c, e)
g.addEdge(3, 5); // 添加边(d, f)
g.addEdge(4, 5); // 添加边(e, f)
cout << "从顶点a开始深度遍历:" << endl;
g.DFS(0); // 从顶点a开始深度遍历
cout << endl;
cout << "深度遍历整个图:" << endl;
g.DFS(); // 深度遍历整个图
cout << endl;
return 0;
}

输出结果如下:

从顶点a开始深度遍历:
a b d f e c
深度遍历整个图:
a b d f e c
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值