重点是深拷贝,也就是需要自己创建一个和给定图一模一样的图。那就肯定需要遍历图,为每一个顶点创建深拷贝,并且进行连接。遍历图无非bfs或者dfs,关键点就是深拷贝+邻接关系创建。
这种类型的题做了好几个,一般都是采用哈希表进行原顶点与深拷贝的顶点之间的映射关系。
bfs
class Solution {
public:
Node* cloneGraph(Node* node) {
if(!node) return node;
unordered_map<Node*, Node*> m;
//bfs遍历
queue<Node*> q;
q.push(node);
m[node] = new Node(node->val);//第一个顶点
while(!q.empty()){
auto v = q.front();
q.pop();
for(const auto &w : v->neighbors){//该顶点的邻接顶点
if(m.count(w) == 0){//一定要检查,不能多次创建,可能会进入死循环
m[w] = new Node(w->val);
q.push(w);
}
m[v]->neighbors.push_back(m[w]);
}
}
return m[node];
}
};
或者使用数组根据下标和顶点值映射也是一样的思路:
class Solution {
public:
Node* cloneGraph(Node* node) {
if(!node) return NULL;
vector<Node*> visited(101, NULL);
queue<Node*> q;
q.push(node);
visited[node->val] = new Node(node->val);//克隆第一个节点
while(!q.empty()){//bfs
auto cur = q.front();
q.pop();
for(const auto &neighbor : cur->neighbors){
if(!visited[neighbor->val]){//没有被访问过
visited[neighbor->val] = new Node(neighbor->val);//进行克隆
q.push(neighbor);
}
visited[cur->val]->neighbors.emplace_back(visited[neighbor->val]);
}
}
return visited[node->val];
}
};
dfs
class Solution {
public:
unordered_map<Node*, Node*> m;
Node* cloneGraph(Node* node) {
if(!node) return node;
if(m.count(node)) return m[node];
//dfs遍历
m[node] = new Node(node->val);//创建顶点
for(const auto &w : node->neighbors){//该顶点的邻接顶点
m[node]->neighbors.push_back(cloneGraph(w));
}
return m[node];
}
};