-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCloneGraph.java
More file actions
57 lines (54 loc) · 1.98 KB
/
CloneGraph.java
File metadata and controls
57 lines (54 loc) · 1.98 KB
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
/**
* Definition for undirected graph.
* class UndirectedGraphNode {
* int label;
* ArrayList<UndirectedGraphNode> neighbors;
* UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
* };
*/
public class Solution {
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if(node==null) return null;
//clone node and append it to neighbors
HashSet<UndirectedGraphNode> set = new HashSet<UndirectedGraphNode>();
dfs1(node, set);
//add neighbors to cloned node
set.clear();
dfs2(node, set);
UndirectedGraphNode newNode = node.neighbors.get(node.neighbors.size()-1);
//remove cloned node from neighbors list
set.clear();
dfs3(node, set);
return newNode;
}
private void dfs1(UndirectedGraphNode node, HashSet<UndirectedGraphNode> set) {
set.add(node);
UndirectedGraphNode newNode = new UndirectedGraphNode(node.label);
node.neighbors.add(newNode);
for(UndirectedGraphNode n : node.neighbors) {
if(n!=newNode && !set.contains(n)) {
dfs1(n, set);
}
}
}
private void dfs2(UndirectedGraphNode node, HashSet<UndirectedGraphNode> set) {
set.add(node);
UndirectedGraphNode newNode = node.neighbors.get(node.neighbors.size()-1);
for(int i = 0; i < node.neighbors.size() -1; i++) {
UndirectedGraphNode n = node.neighbors.get(i);
newNode.neighbors.add(n.neighbors.get(n.neighbors.size()-1));
if(!set.contains(n)) {
dfs2(n, set);
}
}
}
private void dfs3(UndirectedGraphNode node, HashSet<UndirectedGraphNode> set) {
set.add(node);
node.neighbors.remove(node.neighbors.size()-1);
for(UndirectedGraphNode n : node.neighbors) {
if(!set.contains(n)) {
dfs3(n,set);
}
}
}
}