DFS Approach:
注意,對于DFS,對map的賦值要在DFS loop開始以前。這樣可以避免由于graph有loop而造成的死循環。
Key Point:如果graph有環,將map的賦值建立在loop之前。
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> mp;
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if(!node) return NULL;
else if(mp.count(node)) return mp[node];
auto node_copy = new UndirectedGraphNode(node->label);
mp[node] = node_copy;
for(auto it : node->neighbors){
node_copy->neighbors.push_back(cloneGraph(it));
}
return mp[node];
}
};
BFS Approach:
雖然長,但BFS寫起來也很簡單。而且可以避免死循環,以及stack overflow。還是盡量用BFS好了。
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if(!node) return NULL;
unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> mp;
queue<UndirectedGraphNode*> q;
auto *node_copy = new UndirectedGraphNode(node->label);
mp[node] = node_copy;
q.push(node);
while(!q.empty()){
auto cur = q.front(); q.pop();
auto *cur_copy = mp[cur];
mp[cur] = cur_copy;
for(auto it : cur->neighbors){
if(mp.count(it)){
cur_copy->neighbors.push_back(mp[it]);
}
else{
auto it_copy = new UndirectedGraphNode(it->label);
mp[it] = it_copy;
cur_copy->neighbors.push_back(it_copy);
q.push(it);
}
}
}
return mp[node];
}
};