1. Problem Statement
You’re given a reference to a node in a connected, undirected graph. Each node contains:
- An integer value
val - A list of its neighbors:
List<Node> neighbors
You must return a deep copy of the entire graph.
2. Node Definition
class Node {
public int val;
public List<Node> neighbors;
public Node() {
neighbors = new ArrayList<>();
}
public Node(int val) {
this.val = val;
neighbors = new ArrayList<>();
}
public Node(int val, List<Node> neighbors) {
this.val = val;
this.neighbors = neighbors;
}
}
3. Key Idea
This is a classic graph traversal + cloning problem.
When you encounter a node:
- If it hasn’t been cloned yet → create a copy and store it in a map.
- Then recursively or iteratively visit and clone each of its neighbors.
4. DFS Approach with HashMap
We use a Map<Node, Node> to track already cloned nodes and prevent infinite loops.
5. Java Solution: DFS
import java.util.*;
public class CloneGraph {
private Map<Node, Node> visited = new HashMap<>();
public Node cloneGraph(Node node) {
if (node == null) return null;
// If node is already cloned, return the clone
if (visited.containsKey(node)) {
return visited.get(node);
}
// Clone the current node
Node clone = new Node(node.val);
visited.put(node, clone);
// Clone all neighbors
for (Node neighbor : node.neighbors) {
clone.neighbors.add(cloneGraph(neighbor));
}
return clone;
}
}
6. Time and Space Complexity
- Time Complexity: O(N + E),
whereN= number of nodes,E= number of edges - Space Complexity: O(N),
for the visited map and recursion stack
