注意:广度搜索需要的是队列
深度搜索需要的是栈
package d19图的搜索;
//顶点类
public class Vertex {
public char label;
public boolean wasVisited;
public Vertex (char label){
this.label = label;
}
}
package d19图的搜索;
import d03栈和队列.MyStack;
//图
public class Graph {
//顶点数组
private Vertex[] vertexList;
//临界矩阵
private int [] [] adjMat;
//顶点的最大数目
private int maxSize=20;
//栈
private MyStack stack;
//当前节点
private int nVertex;
public Graph(){
vertexList = new Vertex[maxSize];
adjMat = new int [maxSize][maxSize];
for(int i = 0;i<maxSize;i++){
for(int j = 0;j<maxSize;j++){
adjMat[i][j]=0;
}
}
nVertex=0;
stack = new MyStack();
}
//添加顶点
public void addVertex (char label){
vertexList[nVertex++]=new Vertex(label);
}
//添加边
public void addEdge(int start,int end){
adjMat[start][end]=1;
adjMat[end][start]=1;
}
public int getadjUnvisitedVertex(int v){
for(int i = 0;i<nVertex;i++){
if(adjMat[v][i]==1&&vertexList[i].wasVisited==false){
return i;
}
}
return -1;
}
//深度优先搜索
public void dfs(){
//首先访问0号顶点
vertexList[0].wasVisited=true;
//压入栈种
stack.push(0);
//显示该顶点
displayVertex(0);
while(!stack.isEmpty()){
//获得一个为访问过的邻接点
int v = getadjUnvisitedVertex((int)stack.peel());
if(v==-1){
//弹出一个顶点
stack.pop();
}else{
vertexList[v].wasVisited=true;
displayVertex(v);
stack.push(v);
}
}
//搜索完以后要将访问信息修改
for(int i = 0;i<nVertex;i++){
vertexList[i].wasVisited=false;
}
}
public void displayVertex(int v){
System.out.print(vertexList[v].label+" ");
}
}
package d19图的搜索;
public class TestGraph {
public static void main(String[] args) {
Graph g = new Graph();
g.addVertex('A');
g.addVertex('B');
g.addVertex('C');
g.addVertex('D');
g.addVertex('E');
g.addEdge(0, 1);
g.addEdge(0, 3);
g.addEdge(3, 4);
g.dfs();
}
}