解题思路:对每个结点用new方法新建一个一样的结点,并且将对应的label和新节点指针的对应关系保存在Map中,每次遍历一个结点是,对应在节点的neighbors中放入对应新结点的指针。
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
UndirectedGraphNode* getNode(int label, map<int, UndirectedGraphNode*>& graph) {
if (graph.find(label) == graph.end()) {
UndirectedGraphNode* tmp = new UndirectedGraphNode(label);
graph[label] = tmp;
}
return graph[label];
}
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (node == NULL) return NULL;
set<int> visit;
map<int, UndirectedGraphNode*> graph;
queue<UndirectedGraphNode*> que;
que.push(node);
visit.insert(node->label);
while (!que.empty()) {
UndirectedGraphNode* oldNode = que.front();
que.pop();
UndirectedGraphNode* newNode = getNode(oldNode->label, graph);
for (int i = 0; i < oldNode->neighbors.size(); i++) {
UndirectedGraphNode* tmp = oldNode->neighbors[i];
newNode->neighbors.push_back(getNode(tmp->label, graph));
if (visit.count(tmp->label)) continue;
visit.insert(tmp->label);
que.push(tmp);
}
}
return graph[node->label];
}
};