面试被问到广度优先搜索和深度优先搜索的非递归实现,脑袋瞬间空白.....,之前看过的都瞬间忘记了,还是没有多写所以记得不是很牢靠,所以在这里再写一遍。
//dfs递归和非递归实现
#include<stdlib.h>
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct Node {
Node(int v):val(v),gone(false){}
vector<Node *> neighbors;
bool gone;
int val;
};
void dfs(Node *root,vector<int> &result) {
if(root == nullptr)
return;
stack<Node *> save;
save.push(root);
root->gone = true;
result.push_back(root->val);
while (!save.empty()) {
Node *cur = save.top();
int len = (cur->neighbors).size();
int i = 0;
while (i < len && (cur->neighbors)[i]->gone == true) ++i;
if (i == len)
save.pop();
else {
save.push((cur->neighbors)[i]);
(cur->neighbors)[i]->gone = true;
result.push_back((cur->neighbors)[i]->val);
}
}
return;
}
void dfsRecursion(Node *root, vector<int> &result) {
if (root == nullptr)
return;
int len = (root->neighbors).size();
result.push_back(root->val);
root->gone = true;
for (int i = 0; i < len; ++i) {
if ((root->neighbors)[i]->gone == true)
continue;
dfsRecursion((root->neighbors)[i], result);
}
return;
}
void bfs(Node *root, vector<int> &result) {
if (root == nullptr)
return;
queue<Node *> save;
save.push(root);
root->gone = true;
result.push_back(root->val);
while (!save.empty()) {
int size = save.size();
for (int j = 0; j < size; ++j) {
Node *cur = save.front();
save.pop();
int len = (cur->neighbors).size();
for (int i = 0; i < len; ++i) {
if ((cur->neighbors)[i]->gone == true)
continue;
result.push_back((cur->neighbors)[i]->val);
(cur->neighbors)[i]->gone = true;
save.push((cur->neighbors)[i]);
}
}
}
return;
}
int main() {
Node *node1 = new Node(1);
Node *node2 = new Node(2);
Node *node3 = new Node(3);
Node *node4 = new Node(4);
Node *node5 = new Node(5);
Node *node6 = new Node(6);
Node *node7 = new Node(7);
Node *node8 = new Node(8);
Node *node9 = new Node(9);
(node1->neighbors).push_back(node2);
(node1->neighbors).push_back(node3);
(node2->neighbors).push_back(node1);
(node2->neighbors).push_back(node4);
(node2->neighbors).push_back(node5);
(node3->neighbors).push_back(node1);
(node3->neighbors).push_back(node8);
(node3->neighbors).push_back(node7);
(node4->neighbors).push_back(node2);
(node4->neighbors).push_back(node6);
(node5->neighbors).push_back(node2);
(node5->neighbors).push_back(node6);
(node6->neighbors).push_back(node4);
(node6->neighbors).push_back(node5);
(node6->neighbors).push_back(node9);
(node7->neighbors).push_back(node3);
(node7->neighbors).push_back(node9);
(node8->neighbors).push_back(node3);
(node8->neighbors).push_back(node9);
(node9->neighbors).push_back(node6);
(node9->neighbors).push_back(node7);
(node9->neighbors).push_back(node8);
vector<int> result;
dfs(node1, result);
for (auto s : result) {
cout << s << endl;
}
vector<int> result1;
dfsRecursion(node1, result1);
for (auto s : result1) {
cout << s << endl;
}
vector<int> result2;
bfs(node1, result2);
for (auto s : result2) {
cout << s << endl;
}
return 0;
}
输出为:
dfs:1 2 4 6 5 9 7 3 8
dfsRecursion:1 2 4 6 5 9 7 3 8
bfs:1 2 3 4 5 8 7 6 9