圖的廣度VS深度

深度優先搜索用棧(stack)來實現,整個過程可以想象成一個倒立的樹形:

  1. 把根節點壓入棧中。
  2. 每次從棧中彈出一個元素,搜索所有在它下一級的元素,把這些元素壓入棧中。
    並把這個元素記爲它下一級元素的前驅。
  3. 找到所要找的元素時結束程序。
  4. 如果遍歷整個樹還沒有找到,結束程序。

廣度優先搜索使用隊列(queue)來實現,整個過程也可以看做一個倒立的樹形:

  1. 把根節點放到隊列的末尾。
  2. 每次從隊列的頭部取出一個元素,查看這個元素所有的下一級元素,把它們放到隊列的末尾。
    並把這個元素記爲它下一級元素的前驅
  3. 找到所要找的元素時結束程序。
  4. 如果遍歷整個樹還沒有找到,結束程序。
關於深度優先: 廣度優先分析以及代碼展示

以下圖爲例:

該圖的深度優先遍歷結果應該爲:1->2->4->8->5->3->6->7
該圖的廣度優先遍歷結果應該爲:1->2->3->4->5->6->7->8

center

廣度優先代碼展示:
	    //廣度優先遍歷
	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);
	        }
	    }
	}
深度優先代碼展示:

深度優先代碼

代碼運行結果展示:

深度優先:
在這裏插入圖片描述
廣度優先遍歷:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章