Given a reference of a node in a connected undirected graph, return a deep copy (clone) of the graph. Each node in the graph contains a val (int) and a list (List[Node]) of its neighbors.
Example:
Input:
{“KaTeX parse error: Expected '}', got 'EOF' at end of input: …"neighbors":[{"id”:“2”,“neighbors”:[{“KaTeX parse error: Expected 'EOF', got '}' at position 9: ref":"1"}̲,{"id”:“3”,“neighbors”:[{“KaTeX parse error: Expected 'EOF', got '}' at position 9: ref":"2"}̲,{"id”:“4”,“neighbors”:[{“KaTeX parse error: Expected 'EOF', got '}' at position 9: ref":"3"}̲,{"ref”:“1”}],“val”:4}],“val”:3}],“val”:2},{"$ref":“4”}],“val”:1}
Explanation:
Node 1’s value is 1, and it has two neighbors: Node 2 and 4.
Node 2’s value is 2, and it has two neighbors: Node 1 and 3.
Node 3’s value is 3, and it has two neighbors: Node 2 and 4.
Node 4’s value is 4, and it has two neighbors: Node 1 and 3.
Note:
1.The number of nodes will be between 1 and 100.
2.The undirected graph is a simple graph, which means no repeated edges and no self-loops in the graph.
3.Since the graph is undirected, if node p has node q as neighbor, then node q must have node p as neighbor too.
4.You must return the copy of the given node as a reference to the cloned graph.
C++
Node* cloneGraph(Node* node) {
unordered_map<Node*,Node*> m;
return helper(node,m);
}
Node* helper(Node* node,unordered_map<Node*,Node*>& m)
{
if(!node)
return nullptr;
if(m.count(node))return m[node];
Node* clone = new Node(node->val);
m[node] = clone;
for(auto neighbor : node->neighbors)
{
clone->neighbors.push_back(helper(neighbor,m));
}
return clone;
}