深度優先搜索算法(以下簡稱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);
}
}
不過,依賴二叉樹等數據結構實現的深度優先搜索算法,會更加簡明