[leetcode] problem 133 – clone graph

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

k5eE4S.png

Input:
{“$id”:”1”,”neighbors”:[{“$id”:”2”,”neighbors”:[{“$ref”:”1”},{“$id”:”3”,”neighbors”:[{“$ref”:”2”},{“$id”:”4”,”neighbors”:[{“$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

The number of nodes will be between 1 and 100.

The undirected graph is a simple graph, which means no repeated edges and no self-loops in the graph.

Since the graph is undirected, if node p has node q as neighbor, then node q must have node p as neighbor too.

You must return the copy of the given node as a reference to the cloned graph.

O(n) runtime, O(n) space – Depth-first traversal

1
2
3
4
5
public class  {
int label;
List<UndirectedGraphNode> neighbors;
UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if (node == null)
return null;

Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>();
return dfs(map, node);
}

private UndirectedGraphNode dfs(Map<UndirectedGraphNode, UndirectedGraphNode> map, UndirectedGraphNode node) {
UndirectedGraphNode copy = new UndirectedGraphNode(node.label);
map.put(node, copy);

for (UndirectedGraphNode neighbor : node.neighbors) {
if (!map.containsKey(neighbor))
copy.neighbors.add(dfs(map, neighbor));
else
copy.neighbors.add(map.get(neighbor));
}

return copy;
}

O(n) runtime, O(n) space – Breadth-first traversal

1
2
3
4
5
public class  {
int label;
List<UndirectedGraphNode> neighbors;
UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if (node == null)
return null;

Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>();
return bfs(map, node);
}

private UndirectedGraphNode bfs(Map<UndirectedGraphNode, UndirectedGraphNode> map, UndirectedGraphNode node) {
Queue<UndirectedGraphNode> queue = new LinkedList<>();
UndirectedGraphNode copy = new UndirectedGraphNode(node.label);
map.put(node, copy);
queue.offer(node);

while (!queue.isEmpty()) {
UndirectedGraphNode current = queue.poll();

for (UndirectedGraphNode neighbor : current.neighbors) {
if (!map.containsKey(neighbor)) {
queue.offer(neighbor);
map.put(neighbor, new UndirectedGraphNode(neighbor.label));
}

map.get(current).neighbors.add(map.get(neighbor));
}
}

return copy;
}