沿袭上一篇文章的图存储结构,因为知道有向图和无向图的存储结构相同,只不过数据不同,可以理解为无向图是一种方向必须成对存在的有向图,因此,遍历方法实际上是可以通用的,分为邻接矩阵遍历和邻接表遍历。
深度优先搜索
图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。
它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
显然,深度优先搜索是一个递归的过程。
邻接矩阵DFS
public void DFS(){
boolean[] beTraversed=new boolean[size];
for(int i=0;i<size;i++){
beTraversed[i]=false;
}
System.out.println(vertexs[0]);
beTraversed[0]=true;
DFS(0,0,beTraversed);
}
private void DFS(int x,int y,boolean[] beTraversed){
while(y<=size-1){
if(matrix[x][y]!=0&beTraversed[y]==false){
System.out.println(vertexs[y]);
beTraversed[y]=true;
DFS(y,0,beTraversed);
}
y++;
}
}
邻接表DFS
public void DFS(){
boolean[] beTraversed=new boolean[size];
for(int i=0;i<size;i++){
beTraversed[i]=false;
}
for (int i = 0; i < size; i++) {
if (!beTraversed[i])
DFS(beTraversed,vertexLists[i]);
}
}
public void DFS(boolean[] beTraversed,Vertex temp){
System.out.println(temp.ch);
beTraversed[getPosition(temp.ch)]=true;
while(temp!=null){
if(beTraversed[getPosition(temp.ch)]==false){
DFS(beTraversed,vertexLists[getPosition(temp.ch)]);
}
temp=temp.next;
}
}
广度优先搜索
广度优先搜索算法(Breadth First Search),又称为”宽度优先搜索”或”横向优先搜索”,简称BFS。
它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。
换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2…的顶点。
邻接矩阵BFS
public void BFS(){
boolean[] beTraversed=new boolean[size];
for(int i=0;i<size;i++){
beTraversed[i]=false;
}
System.out.println(vertexs[0]);
beTraversed[0]=true;
BFS(0,beTraversed);
}
public void BFS(int x,boolean[] beTraversed){
LinkedList<Character> list=new LinkedList<Character>();
int y=0;
while(y<=size-1){
if(matrix[x][y]!=0&beTraversed[y]==false){
System.out.println(vertexs[y]);
beTraversed[y]=true;
list.add(vertexs[y]);
}
y++;
}
while(!list.isEmpty()){
char ch=list.pop();
int t=getPosition(ch);
BFS(t,beTraversed);
}
}
邻接表BFS
public void BFS(){
boolean[] isTraversed=new boolean[size];
for(int i=0;i<size;i++){
isTraversed[i]=false;
}
System.out.println(vertexLists[0].ch);
isTraversed[0]=true;
BFS(0,isTraversed);
}
public void BFS(int x,boolean[] isTraversed){
Vertex temp=vertexLists[x];
LinkedList<Vertex> list=new LinkedList<Vertex>();
while(temp!=null){
if(isTraversed[getPosition(temp.ch)]==false){
System.out.println(temp.ch);
isTraversed[getPosition(temp.ch)]=true;
list.add(temp);
}
temp=temp.next;
}
while(!list.isEmpty()){
Vertex v=list.pop();
int t=getPosition(v.ch);
BFS(t,isTraversed);
}
}