题目如下
解题思路
为了避免重复的递归,我们使用哈希表存下已经递归过的节点
c++代码
/*
// 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*> visited; //记录原节点对应的新图中的克隆节点
Node* cloneGraph(Node* node) //递归一定要弄清楚函数的返回值是什么,这儿返回值是node节点对应的克隆图中的节点
{
if(!node)
return nullptr; //空节点直接返回
if(visited.find(node)!=visited.end()) //如果已经克隆好了,那么我们直接用就行,不用再克隆了
return visited[node];
Node* cloneNode=new Node(node->val); //克隆新节点,注意要实现深拷贝,不能直接传原节点的邻居集
visited[node]=cloneNode;
for(auto &i:node->neighbors) //对于node的邻居集中的每个节点,都进行克隆,然后把克隆的节点加入到cloneNode的邻居集中
cloneNode->neighbors.push_back(cloneGraph(i)); //cloneGraph返回的是i对应的克隆节点
return cloneNode;
}
};