解题思路:
1,要避免环带来的干扰,hash表没商量;
2,但如果用unordered_set, 麻烦,应为对一个 original node,你只能通过label去判断是否已经克隆,这不能用set原有的 find方法。如果你set中存label,必然要有一个对应的存pointer的存储结构。
3,所以,用unordered_map,从 originalGraph 映射到 cloneGraph,节点一一对应,label什么的都不用管了;
4,搜索,深搜或者广搜都可以。
方法一,BFS:
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
// BFS
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (node == NULL) return NULL;
queue<UndirectedGraphNode *> q;
q.push(node);
_map[node] = new UndirectedGraphNode(node->label);
while(!q.empty()){
auto nd = q.front();
q.pop();
auto it = nd->neighbors.begin();
while(it != nd->neighbors.end()){
if (_map.find(*it) == _map.end()){
_map[*it] = new UndirectedGraphNode((*it)->label);
q.push(*it);
}
_map[nd]->neighbors.push_back(_map[*it]);
it++;
}
}
return _map[node];
}
private:
unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> _map;
};
方法二,DFS:
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
// DFS
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (node == NULL) return NULL;
if (_map.find(node) == _map.end()){
_map[node] = new UndirectedGraphNode(node->label);
auto it = node->neighbors.begin();
while(it != node->neighbors.end()){
_map[node]->neighbors.push_back(cloneGraph(*it));
it++;
}
}
return _map[node];
}
private:
unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> _map;
};