这里的图的深度优先算法利用了栈来实现。
图的深度遍历原则:
1 如果有可能,访问一个领接的未访问的节点,标记它,并把它放入栈中。
2 当不能执行规则 1 时,如果栈不为空,则从栈中弹出一个元素。
3 如果不能执行规则 1 和规则 2 时,则完成了遍历。
代码中的图使用的是Graph 图-邻接矩阵法
来表示,其他的表示法请见:Graph 图-邻接表法
代码中的Stack为辅助结构,用来记载访问过的节点。栈的详细描述可以见:ArrayStack 栈
,LinkedStack 栈
。
Vertex表示图中的节点,其中包含访问,是否访问,清除访问标志的方法。
Graph.main:提供简单测试。代码可以以指定下标的节点开始作深度遍历。
代码比较简单,除了Graph.dsf(int i)深度优先遍历算法外没有过多注释。
代码如下:
class Stack {
private int[] values;
private int pos = -1;
Stack(int size) {
values = new int[size];
}
void push(int value) { values[++pos] = value; }
int pop() { return values[pos--]; }
int peek() { return values[pos]; }
boolean isEmpty() { return pos == -1; }
}
class Vertex {
private Object value;
private boolean isVisited;
Vertex(Object value) {
this.value = value;
}
void visit() { isVisited = true; print(); }
void clean() { isVisited = false; }
boolean isVisited() { return isVisited; }
void print() { System.out.println(value); }
}
class Graph {
private Vertex[] vertexs;
private int[][] adjMat;
private int pos = -1;
Graph(int size) {
vertexs = new Vertex[size];
adjMat = new int[size][size];
}
void add(Object value) {
assert pos < vertexs.length;
vertexs[++pos] = new Vertex(value);
}
void connect(int from, int to) {
adjMat[from][to] = 1;
adjMat[to][from] = 1;
}
void disConnect(int from, int to) {
adjMat[from][to] = 0;
adjMat[to][from] = 0;
}
int findNeighbor(int index) {
for(int i=0; i<=pos; i++) {
if(adjMat[index][i] == 1 && !vertexs[i].isVisited()) return i;
}
return -1;
}
void dsf(int index) { //从指定下标的节点开始深度优先遍历
if(vertexs[index] == null) return; //如果图中没有指定下标节点,则退出
Stack s = new Stack(vertexs.length); //创建栈记载访问过的节点的下标
vertexs[index].visit(); //访问0节点
s.push(index); //记录0节点
while(!s.isEmpty()) { //如果还有记录的节点则继续
index = findNeighbor(s.peek()); //寻找栈顶节点的未访问过的邻居
if(index != -1) { //如果找到
vertexs[index].visit(); //访问该节点
s.push(index); //记录该节点
} else s.pop(); //没有未访问过的节点,则出栈
} //如果栈未空则代表遍历完成
clean(); //清除所有访问标致
}
void clean() { for(Vertex v: vertexs) if(v != null)v.clean(); }
public static void main(String[] args) {
Graph g = new Graph(20);
g.add('a');
g.add('b');
g.add('c');
g.add('d');
g.add('e');
g.connect(0,1);
g.connect(1,2);
g.connect(0,3);
g.connect(3,4);
g.dsf(4);
}
}
分享到:
相关推荐
"图的深度优先遍历和广度优先遍历算法" 图的深度遍历和广度遍历是两个重要的算法,这也是我们理解并掌握图这一数据结构的基础。通过此程序算法可以进一步掌握图的构造以及遍历的相关知识。 图的深度优先遍历算法 ...
c++-深度优先遍历的递归实现版本
无向图建立、深度优先遍历和广度优先遍历实现算法 本文将详细介绍无向图的建立、深度优先遍历和广度优先遍历的实现算法。这些算法是数据结构中非常重要的内容,掌握它们对后续学习和应用非常重要。 一、无向图的...
在本主题中,我们重点关注的是图数据结构的深度优先遍历(DFS, Depth First Search)。 首先,数据结构是计算机程序设计的基础,常见的数据结构包括数组、链表、栈、队列、树和图等。每种数据结构都有其独特的特点...
【深度优先遍历】是一种在图或树结构中进行遍历的方法,它的基本思路是从一个节点开始,尽可能深地探索图的分支。当一个节点的所有未访问过的邻接节点都被访问后,才回溯到其上一个节点,再选择一个未访问的邻接节点...
在本文中,我们将深入探讨图的数据结构以及如何对图进行深度优先遍历(DFS)和广度优先遍历(BFS)。首先,我们要理解图的基本概念。图是一种数据结构,用于表示对象之间的关系,其中的对象称为顶点或节点,而它们...
充分利用kNN查询自身的特点,基于高效的主存索引Δ-tree设计了一种新的kNN查询算法NR_DF_knn_Search,该算法采用非递归方式深度优先搜索Δ-tree中距离查询点较近的叶子节点,能够快速找到较优的kNN候选,更新修剪...
图的相关操作,对图实现深度优先遍历,值得!!!!!!
该程序是我写的博客“一起talk C栗子吧(第四十四回:C语言实例--深度优先遍历一)”的配套程序,共享给大家使用
"建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历" 本文档主要介绍了图的存储方式,包括邻接矩阵和邻接表两种存储方法,并在此基础上实现了图的深度优先遍历和广度优先遍历。 一、图...
### 图的深度优先遍历和广度优先遍历:核心概念与实现 #### 图的遍历算法概述 在数据结构中,图是一种重要的非线性数据结构,它由顶点集合V和边集合E组成,表示实体之间的关系。图的遍历是指按照某种策略访问图中...
深度优先遍历(DFS)是一种经典的图遍历算法,其基本思想是:从某个起始节点开始,依次遍历该节点的所有邻居节点;然后递归遍历这些邻居节点的未被访问过的邻居节点,直到所有节点都被遍历为止。
根据给定文件的信息,我们可以总结出以下几个主要的知识点: ### 1. 图的定义与表示 ...以上就是关于图的建立及深度优先遍历和广度优先遍历的主要知识点。通过理解这些概念,可以帮助我们更好地分析和解决问题。
本文将详细探讨如何利用邻接矩阵来实现图的深度优先遍历(DFS)和广度优先遍历(BFS),以及这两种遍历方法的特点和应用。 首先,邻接矩阵是用二维数组来表示图的一种方法。假设图有n个顶点,那么邻接矩阵是一个n×...
**深度优先遍历(DFS,Depth First Search)**是从一个顶点开始,尽可能深地探索图的分支,直到到达叶子节点或者回溯到没有未访问过的邻接点为止。在遍历过程中,可以通过访问标志数组`visited`来跟踪哪些顶点已经被...
广度优先遍历是一种用于遍历或搜索树或图的算法,它从根节点开始,沿着树的宽度优先遍历所有节点。在迷宫问题中,我们把迷宫视为一个图,每个可通行的格子看作一个节点,相邻的格子之间有边相连。以下是利用BFS解决...
在邻接矩阵的存储结构下,实现图的深度优先遍历和广度优先遍历。
本话题主要探讨如何使用非递归算法对无向图进行深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),这两种遍历方法在图算法中有着广泛的应用。 **1. 邻接表表示法** 在处理大...