深度優先搜索算法(附C++實現)

深度優先搜索算法(以下簡稱DFS)是一種用於遍歷(或搜索)樹(或圖)的算法。

我們構造這樣一個圖(如圖1),並通過C++實現DFS

                        圖1(圖片來源於codeforces.com)

算法過程

1.從根節點開始

2.放入一個節點(起始時放入的爲根節點)

3.如果這個節點是第一次出現,則放入堆棧中

4.判斷該節點的子節點是否搜索完成,

        a.如果是則將該節點出棧,判斷該棧是否爲空

             a.1 若爲空則結束

            a.2 若不爲空則取棧頂元素,並回到第2步

        b.如果沒有完成搜索,取未被搜索的根節點,並回到第2步

以下代碼在vs2017中通過編譯

//利用C++實現深度優先搜索算法,如有疑問請聯繫
//作者:cclplus 郵箱:[email protected]
#include<iostream>
#include<vector>
#include<stack>
#include<memory.h>

using namespace std;

vector<vector<int>> tree;//聲明一個二維向量
int flag[10];//用於搜索到了節點i的第幾個節點
stack <int>stk;//聲明一個堆棧
int ar_tree[8] = { 1,1,1,3,5,3,5,7 };
void DFS(int node) {
	cout << node <<" ";
	if (flag[node] == 0) {
		stk.push(node);
	}
	int temp;
	//判斷node的子節點是否搜索完成
	if (flag[node] < tree[node].size()) {
		temp = tree[node][flag[node]];
		flag[node]++;
		DFS(temp);
	}
	else {//若已經完成
		stk.pop();//彈出子節點
		if (!stk.empty()) {//若堆棧不爲空
			temp = stk.top();//取此時的棧頂元素,即爲node的上一級節點
			DFS(temp);
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	memset(flag, 0, sizeof(flag));
	register int i,temp;
	tree.resize(10);//圖中的數共有九個節點
	//生成樹
	for (i = 2; i <=9; i++) {
		temp = ar_tree[i - 2];
		tree[temp].push_back(i);//表示第i個節點爲第temp個節點的子節點
	}
	//DFS
	cout << "DFS過程:" << endl;
	DFS(1);
	cout << endl;
	return 0;
}

            輸入結果如下

事實上,DFS函數可以通過更短的代碼實現,如下

void DFS(int node) {
	cout << node << " ";
	for (int c : tree[node]) {
		DFS(c);
	}
}

不過,依賴二叉樹等數據結構實現的深度優先搜索算法,會更加簡明

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