我基础非常差,写了老半天的非递归深度优先遍历,还请各位看看写的对不对
/**
* 深度优先遍历
*
* @param start 路径查找起始点
* @param end 路径查找终点
*/
public void depthFirstSearch(int start, int end) {
if (start == end) {
return;
}
// 定义一个visited数组,保存是否访问过
boolean[] visited = new boolean[v];
// 定义一个栈,作为一个后进先出栈,保存已访问,但相连节点未访问的节点
Stack<Integer> stack = new Stack<Integer>();
// 先将start压入栈中
visited[start] = true;
stack.push(start);
while (!stack.isEmpty()) {
// 取出,但不出栈
int step = stack.peek();
// 标识位,标识step节点下的邻接节点中是否有未走过的节点
boolean hasNoVisited = false;
for (int i = 0; i < adj[step].size(); i++) {
int nextStep = adj[step].get(i);
// 存在未走过节点,则flag = true,将nextStep压入栈中,继续前行
if (visited[nextStep] == false) {
hasNoVisited = true;
visited[nextStep] = true;
stack.push(nextStep);
if (nextStep == end) {
return;
}
break;
}
}
// 邻接的节点都是已走过的,则出栈
if (hasNoVisited == false) {
stack.pop();
}
}
// 遍历输出栈中存储的节点,即路径
if (!stack.isEmpty()) {
Iterator<Integer> it = stack.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
}
}
展开