一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)
2013-08-17 12:52
483 查看
前面已经说了图的深度优先遍历算法,是用递归实现的,而在这里就讲一下用非递归实现,需要借助栈:
算法思想:
1. 栈初始化
2. 输出起始顶点,起始顶点改为“已访问”标志,将起始顶点进栈
3. 重复下列操作直到栈为空:
3.1 取栈顶元素顶点
3.2 栈顶元素顶点存在未被访问过的邻接点w,则:
3.2.1 输出顶点w
3.2.2 将顶点w改为“已访问”标志
3.2.3 将顶点w进栈
3.3 否则,当前顶点出栈
非递归实现深度优先遍历(邻接链表法)
非递归实现深度优先遍历(邻接矩阵法)
算法思想:
1. 栈初始化
2. 输出起始顶点,起始顶点改为“已访问”标志,将起始顶点进栈
3. 重复下列操作直到栈为空:
3.1 取栈顶元素顶点
3.2 栈顶元素顶点存在未被访问过的邻接点w,则:
3.2.1 输出顶点w
3.2.2 将顶点w改为“已访问”标志
3.2.3 将顶点w进栈
3.3 否则,当前顶点出栈
非递归实现深度优先遍历(邻接链表法)
static void orther_dfs(TLGraph* tGraph, int v, int visited[], LGraph_Printf* pFunc) { LinkStack* stack = LinkStack_Create(); LinkStack_Push(stack, tGraph->v + v); while(!LinkStack_Empty(stack)) { int w = (LVertex**)LinkStack_Top(stack) - tGraph->v; LinkStack_Pop(stack); if(!visited[w]) { int i = 0; pFunc(tGraph->v[w]); visited[w] = 1; for(i=0; i<LinkList_Length(tGraph->la[v]); i++) { if(!visited[i]) { LinkStack_Push(stack, tGraph->v + i); } } } } LinkStack_Destroy(stack); } void LGraph_DFS_Orther(LGraph* graph, int v, LGraph_Printf* pFunc) { TLGraph* tGraph = (TLGraph*)graph; int* visited = NULL; int condition = (NULL != tGraph); condition = condition && (0 <= v) && (v < tGraph->count); condition = condition && (NULL != pFunc); condition = condition && (NULL != (visited = (int*)calloc(tGraph->count, sizeof(int)))); if(condition) { int i = 0; orther_dfs(tGraph, v, visited, pFunc); for(i=0; i<tGraph->count; i++) { if(!visited[i]) { orther_dfs(tGraph, i, visited, pFunc); } } printf("\n"); } free(visited); }
非递归实现深度优先遍历(邻接矩阵法)
static void orther_dfs(TMGraph* tGraph, int v, int visited[], MGraph_Printf* pFunc) { LinkStack* stack = LinkStack_Create(); LinkStack_Push(stack, tGraph->v + v); while(!LinkStack_Empty(stack)) { int w = (MVertex**)LinkStack_Top(stack) - tGraph->v; LinkStack_Pop(stack); if(!visited[w]) { int i = 0; pFunc(tGraph->v[w]); visited[w] = 1; for(i=0; i<LinkList_Length(tGraph->count); i++) { if((0!=tGraph->matrix[v][i]) && (!visited[i])) { LinkStack_Push(stack, tGraph->v + i); } } } } LinkStack_Destroy(stack); } void MGraph_DFS_Orther(MGraph* graph, int v, MGraph_Printf* pFunc) { TMGraph* tGraph = (TMGraph*)graph; int* visited = NULL; int condition = (NULL != tGraph); condition = condition && (0 <= v) && (v < tGraph->count); condition = condition && (NULL != pFunc); condition = condition && (NULL != (visited = (int*)calloc(tGraph->count, sizeof(int)))); if(condition) { int i = 0; orther_dfs(tGraph, v, visited, pFunc); for(i=0; i<tGraph->count; i++) { if(!visited[i]) { orther_dfs(tGraph, i, visited, pFunc); } } printf("\n"); } free(visited); }
相关文章推荐
- 一步一步学数据结构之n--n(图遍历--深度优先遍历--递归实现)
- 一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)
- 二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式
- 数据结构 —— 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 百度面试题——简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 【数据结构】邻接矩阵表示法的图的深度广度优先遍历递归和非递归遍历
- 数据结构(二叉树系列)先序创建三种遍历和求深度(递归实现)
- 【数据结构】邻接矩阵表示法的图的深度广度优先遍历递归和非递归遍历
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构和算法之:图的深度优先和广度优先遍历及其Java实现
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- leetcode 526. Beautiful Arrangement 递归实现全排列 + 经典深度优先遍历DFS做法
- 数据结构--图的理解:深度优先和广度优先遍历及其 Java 实现
- java 实现二叉树深度优先遍历的 前、中、后序遍历(递归)
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点