深度優先搜索用棧(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);
}
}
}
深度優先代碼展示:
代碼運行結果展示:
深度優先:
廣度優先遍歷: