题目链接:
https://leetcode-cn.com/problems/clone-graph/
难度:中等
133. 克隆图
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。
class Node {
public int val;
public List<Node> neighbors;
}
题目不难 才做过类似的 方法一模一样。。。
递归
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> neighbors;
Node() {
val = 0;
neighbors = vector<Node*>();
}
Node(int _val) {
val = _val;
neighbors = vector<Node*>();
}
Node(int _val, vector<Node*> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
*/
class Solution {
public:
unordered_map<Node*,Node*> flag;
// 一
Node* cloneGraph(Node* node) {
if(node==nullptr){
return node;
}
if(flag.find(node)!=flag.end()){
return flag[node];
}
Node* ans=new Node(node->val);
flag[node]=ans;
for(auto &nei:node->neighbors){
ans->neighbors.emplace_back(cloneGraph(nei));
}
return ans;
}
};
// 二
// 当然也可以将所有的node:newnode全部存在flag中
// 然后枚举建立关系
void dfs(Node* node){
flag[node]=new Node(node->val);
for(auto nei:node->neighbors){
if(flag.find(nei)==flag.end()){
dfs(nei);
}
}
}
Node* cloneGraph(Node* node) {
if(node==nullptr){
return node;
}
dfs(node);
for(auto [s , d] : flag){
for(auto nei:s->neighbors){
d->neighbors.push_back(flag[nei]);
}
}
return flag[node];
}
这个是使用queue 不使用递归 (写的时候出错了 看了下题解 哎 还是不太熟练。。。 这个月这种类型的题估计不少 慢慢练吧 我还是太菜了)
class Solution {
public:
Node* cloneGraph(Node* node) {
if(node==nullptr){
return node;
}
unordered_map<Node*,Node*> flag;
queue<Node*> que;
flag[node]=new Node(node->val);
que.emplace(node);
while(!que.empty()){
Node *cur=que.front();
que.pop();
for(auto &nei:cur->neighbors){
Node *newnode;
if(flag.find(nei)!=flag.end()){
newnode=flag[nei];
}else{
newnode=new Node(nei->val);
flag[nei]=newnode;
que.emplace(nei);
}
flag[cur]->neighbors.emplace_back(newnode);
}
}
return flag[node];
}
};