需要的方法:
// 得到第一个邻接点下标
public int getFirstNeighbor(int index) {
for (int i = 0; i < vertexList.size(); i++) {
if (edges[index][i] > 0) {
return i;
}
}
return -1;
}
// 根据前一个邻接点下标获取下一个邻接点
/**
* @param v1 之前的结点
* @param v2 后来点为0的位置
*/
public int getNextNeighbor(int v1, int v2) {
for (int i = v2 + 1; i < vertexList.size(); i++) {
if (edges[v1][i] > 0) {
return i;
}
}
return -1;
}
一.深度优先
每次都在访问完当前结点后首先访问当前结点的第一个邻接结点
public void dfs(boolean[] isVisited, int i) {
System.out.print(getValueByIndex(i) + "->");
isVisited[i] = true;
int w = getFirstNeighbor(i);
while (w != -1) {
if (!isVisited[w]) {
dfs(isVisited, w);
}
w = getNextNeighbor(i, w);
}
}
二.广度优先
优先遍历邻居节点而不是子节点的图遍历算法
public void bfs(boolean[] isVisited, int i) {
int u; // 队列头节点下标
int w; // 邻接结点
// 队列
LinkedList queue = new LinkedList();
System.out.print(getValueByIndex(i) + "=>");
isVisited[i] = true;
queue.addLast(i);
while (!queue.isEmpty()) {
// 第一个结点
u = (Integer) queue.removeFirst();
// 邻接结点
w = getFirstNeighbor(u);
while (w != -1) {
if (!isVisited[w]) {
System.out.print(getValueByIndex(w) + "=>");
isVisited[w] = true;
queue.addLast(w);
}
w = getNextNeighbor(u, w);
}
}
}