-
-
Notifications
You must be signed in to change notification settings - Fork 161
/
Copy pathCloneGraph.java
91 lines (74 loc) · 2.38 KB
/
CloneGraph.java
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package java1.algorithms.graph;
import java.util.*;
class Node {
public int val;
public List<Node> neighbours;
public Node() {
val = 0;
neighbours = new ArrayList<Node>();
}
public Node(int _val) {
val = _val;
neighbours = new ArrayList<Node>();
}
public Node(int _val, List<Node> _neighbours) {
val = _val;
neighbours = _neighbours;
}
}
public class CloneGraph {
private static Map<Integer, Node> map = new HashMap<>();
//DFS: TC:O(n) SC:O(n)
private static Node cloneGraph1(Node node) {
if (node == null) return null;
if (map.containsKey(node.val)) {
return map.get(node.val);
}
else {
Node copyNode = new Node(node.val);
map.put(node.val, copyNode);
for (Node neighbour : node.neighbours) {
copyNode.neighbours.add(cloneGraph1(neighbour));
}
return copyNode;
}
}
//BFS: TC:O(n+e) SC:O(n)
private static Node cloneGraph2(Node node) {
if(node == null) return null;
Map<Integer, Node> map = new HashMap<>();
Node clonedNode = new Node(node.val);
map.put(node.val, clonedNode);
Queue<Node> queue = new LinkedList<>();
queue.add(clonedNode);
while(!queue.isEmpty()) {
Node currNode = queue.poll();
List<Node> newNeighbours = currNode.neighbours;
for(Node neighbour: newNeighbours) {
if(!map.containsKey(neighbour.val)) {
Node temp = new Node(neighbour.val);
map.put(neighbour.val, temp);
queue.add(neighbour);
}
newNeighbours.add(map.get(neighbour.val));
}
}
return node;
}
public static void main(String[] args) {
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
node1.neighbours.add(node2);
node1.neighbours.add(node3);
node2.neighbours.add(node1);
node2.neighbours.add(node4);
node4.neighbours.add(node2);
node4.neighbours.add(node3);
node3.neighbours.add(node4);
node3.neighbours.add(node1);
System.out.println(cloneGraph1(node1));
System.out.println(cloneGraph2(node1));
}
}