
Problem Statement
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 value (int) and a list (List[Node]) of its neighbors.
Example 1:
Input:
1--2
| |
4--3
Expected Output:
1--2
| |
4--3
Explanation: The graph has four nodes with the following connections:
- Node
1is connected to nodes2and4. - Node
2is connected to nodes1and3. - Node
3is connected to nodes2and4. - Node
4is connected to nodes1and3.
Example 2:
Input:
1--2
/ \
5 3
|
4
Expected Output:
1--2
/ \
5 3
|
4
Explanation: The graph consists of five nodes with these connections:
- Node
1is connected to nodes2and5. - Node
2is connected to nodes1and3. - Node
3is connected to nodes2and4. - Node
4is connected to node3. - Node
5is connected to node1.
Example 3:
Input:
1--2
/ \
4 3
\ /
5--6
Expected Output:
1--2
/ \
4 3
\ /
5--6
Explanation: The graph has six nodes with the following connections:
- Node
1is connected to nodes2and4. - Node
2is connected to nodes1and3. - Node
3is connected to nodes2and6. - Node
4is connected to nodes1and5. - Node
5is connected to nodes4and6. - Node
6is connected to nodes3and5.
Constraints:
- The number of nodes in the graph is in the range
[0, 100]. 1 <= Node.val <= 100Node.valis unique for each node.- There are no repeated edges and no self-loops in the graph.
- The Graph is connected and all nodes can be visited starting from the given node.
Solution
To deep clone a given graph, the primary approach is to traverse the graph using Depth-First Search (DFS) and simultaneously create clones of the visited nodes. A hashmap (or dictionary) is utilized to track and associate original nodes with their respective clones, ensuring no duplications.
-
Initialization: Create an empty hashmap to match the original nodes to their clones.
-
DFS Traversal and Cloning: Traverse the graph with DFS. When encountering a node not in the hashmap, create its clone and map them in the hashmap. Recursively apply DFS for each of the node's neighbors. After cloning a node and all its neighbors, associate the cloned node with the clones of its neighbors.
-
Termination: Once DFS covers all nodes, return the cloned version of the starting node.
Algorithm Walkthrough (using Example 1):
For the input graph:
1--2
| |
4--3
- Start with an empty hashmap
visited. - Begin DFS with node
1.- Node
1isn't invisited. Clone it to get1'and map(1, 1')in the hashmap. - For each neighbor of node
1, apply DFS.- First with
2.- Node
2isn't invisited. Clone to get2'and map(2, 2'). - Node
2's neighbors are1and3. Node1is visited, so link2'to1'. Move to3.- Node
3isn't invisited. Clone to get3'and map(3, 3'). - Node
3has neighbors2and4. Node2is visited, so link3'to2'. Move to4.- Node
4isn't invisited. Clone to get4'and map(4, 4'). - Node
4has neighbors1and3, both visited. Link4'to1'and3'.
- Node
- Node
- Node
- First with
- Node
- With DFS complete, return the clone of the starting node,
1'.
Code
Complexity Analysis
-
Time Complexity: O(N+M) where N is the number of nodes and M is the number of edges. Each node and edge is visited once.
-
Space Complexity: O(N) as we are creating a clone for each node. Additionally, the recursion stack might use O(H) where H is the depth of the graph (in the worst case this would be O(N).