深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形:
- 把根节点压入栈中。
- 每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。
并把这个元素记为它下一级元素的前驱。 - 找到所要找的元素时结束程序。
- 如果遍历整个树还没有找到,结束程序。
广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:
- 把根节点放到队列的末尾。
- 每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。
并把这个元素记为它下一级元素的前驱 - 找到所要找的元素时结束程序。
- 如果遍历整个树还没有找到,结束程序。
关于深度优先: 广度优先分析以及代码展示
以下图为例:
该图的深度优先遍历结果应该为:1->2->4->8->5->3->6->7
该图的广度优先遍历结果应该为:1->2->3->4->5->6->7->8
广度优先代码展示:
//广度优先遍历
public void bfs() {
for (int i = 0; i < getNum(); i++) {
if (!isVisited[i]) bfs(isVisited, i);
}
}
private void bfs(boolean[] isVisited, int i) {
int u;//表示队列头对应下标
int w;//邻接节点
LinkedList<Integer> list = new LinkedList<Integer>();
System.out.println(getValueByIndex(i));
list.addLast(i);
isVisited[i] = true;
while (!list.isEmpty()) {
u = list.removeFirst();
w = getFirstNode(u);
while (w != -1) {
if (!isVisited[w]) {
list.addLast(w);
isVisited[w] = true;
System.out.println(getValueByIndex(w));
}
w = getNextNode(u, w);
}
}
}
深度优先代码展示:
代码运行结果展示:
深度优先:
广度优先遍历: