关于图的深度优先的递归和非递归算法

本文介绍了如何对无向图进行深度优先遍历,特别是从节点S出发,按照字母顺序遍历得到SABCDEFGH的结果。作者强调了此图的特殊性,用于检测遍历算法的正确性,并提供了相应的代码实现。
摘要由CSDN通过智能技术生成

题目:给定一个无向图,给出它的深度遍历

先给出图


从S出发,按照字母顺序深度遍历图可得出的结果:SABCDEFGH

这个图十分的特殊,可以检测到有些错误的遍历方法,有些错误的遍历方法有时候可以通过简单的图,但是这张图是不行的,至于如何证明,笔者这里不多加证明

下面给出我的代码:


import java.util.Stack;

public class bianli {
 private Object[] jiedian;//存储节点
 private int num;//节点个数
 private int juzhen[][];//邻接矩阵
 private boolean visit[];//判断是否遍历

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度优先搜索(DFS)是一种遍历算法,它从指定的起始顶点开始遍历,尽可能深地遍历的分支,直到到达叶子节点或者无法继续为止。C语言中实现DFS算法递归方法和非递归方法。 1. 递归方法: 递归方法使用函数的递归调用实现深度优先搜索。具体实现步骤如下: 1. 定义一个visited数组,用于标记每个顶点是否被访问过。 2. 从指定的起始顶点开始,对每个未被访问过的相邻顶点进行深度优先遍历遍历过程中将访问过的顶点标记为已访问。 3. 递归调用DFS函数,直到所有的顶点都被遍历完成。 以下是C语言中实现DFS递归算法的示例代码: ```c #define MAX_VERTEX_NUM 100 int visited[MAX_VERTEX_NUM]; // 标记每个顶点是否被访问过 void DFS(int v, int **G, int n) { visited[v] = 1; // 标记顶点v已被访问过 for(int i=0; i<n; i++) { if(G[v][i] && !visited[i]) { // 如果顶点i与v相邻且未被访问过 DFS(i, G, n); // 递归遍历顶点i } } } ``` 2. 非递归方法: 非递归方法使用栈来实现深度优先搜索。具体实现步骤如下: 1. 定义一个visited数组,用于标记每个顶点是否被访问过。 2. 定义一个栈S,将起始顶点压入栈中。 3. 当栈不为空时,取出栈顶元素v,若v未被访问过,则遍历v的所有未被访问过的相邻顶点,并将这些顶点压入栈中。 4. 遍历完v的所有相邻顶点后,将v标记为已访问。 以下是C语言中实现DFS非递归算法的示例代码: ```c #define MAX_VERTEX_NUM 100 int visited[MAX_VERTEX_NUM]; // 标记每个顶点是否被访问过 void DFS(int v, int **G, int n) { int stack[MAX_VERTEX_NUM]; // 定义栈S int top = -1; // 栈顶指针 stack[++top] = v; // 将起始顶点v入栈 visited[v] = 1; // 标记顶点v已被访问过 while(top >= 0) { int cur = stack[top--]; // 取出栈顶元素 for(int i=0; i<n; i++) { if(G[cur][i] && !visited[i]) { // 如果顶点i与cur相邻且未被访问过 stack[++top] = i; // 将顶点i入栈 visited[i] = 1; // 标记顶点i已被访问过 } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值