一.深度优先遍历
图的深度优先遍历就是纵向遍历,一直搜索直到无法搜索
具体流程如下:
- 1.访问初始结点v,并标记结点v为已访问。
- 2.查找结点v的第一个邻接结点w。
- 3.若w存在,则继续执行4,否则算法结束。
- 4.若w未被访问,对w进行深度优先遍历递归(即把w当做另一个v,然后进行步骤123)。
- 5.查找结点v的下一个邻接结点w,转到步骤3。
先得定义一个boolean类型的数组表示节点是否被访问过
private boolean[] isVisited;//表示节点是否被访问过
//获取该节点的下一节点
public int getNextVertex(int v1,int v2){
for(int j = v2+1;j<vertexList.size();j++){
if(edges[v1][j]>0){
return j;
}
}
return -1;
}
public void dfs(){
dfs(isVisited,0);
}
public void dfs(boolean[] isVisited,int i){
System.out.println(vertexList.get(i));
isVisited[i] = true;//将已经访问过的节点进行标记
int w = getNextVertex(i,-1);//该节点的第一个邻接节点,将v2初始化成-1
while(w!=-1){//如果w是-1则说明该节点已无邻接节点,退出
if(!isVisited[w]){
dfs(isVisited,w);
}
w = getNextVertex(i,w);
}
}
二.广度优先遍历
广度优先遍历则是遍历每个节点的所有邻接节点遍历完成后在跳望下一个节点,类似于层次遍历
具体算法表述如下:
- 1.访问初始结点v并标记结点v为已访问。
- 2 .结点v入队列
- 3.当队列非空时,继续执行,否则算法结束。
- 4.出队列,取得队头结点u。
- 5.查找结点u的第一个邻接结点w。
- 6.若结点u的邻接结点w不存在,则转到步骤3;否则循环执行以下三个步骤:
- (1). 若结点w尚未被访问,则访问结点w并标记为已访问。
- (2). 结点w入队列
- (3). 查找结点u的继w邻接结点后的下一个邻接结点w,转到步骤6。
public void bfs(){
bfs(isVisited,0);
}
private void bfs(boolean[] isVisited,int i){
//打印第一个顶点并标记
System.out.println(vertexList.get(i));
isVisited[i] = true;
//创建队列并使第一个顶点入队
LinkedList queue = new LinkedList();
queue.add(i);
while(!queue.isEmpty()){//队列非空则继续
int u = (Integer) queue.removeFirst();//出队顶点(也就是目前正在遍历的层)
int w = getNextVertex(u,-1);//获取第一个邻接顶点
while(w!=-1){
if(!isVisited[w]){
System.out.println(vertexList.get(w));
isVisited[w] = true;
queue.addLast(w);
}
w = getNextVertex(u,w);
}
}
}