Clone an undirected graph. Each node in the graph contains alabel
and a list of itsneighbors
.
OJ's undirected graph serialization:
Nodes are labeled uniquely.
We use
#
as a separator for each node, and
,
as a separator for node label and each neighbor of the node.
As an example, consider the serialized graph{0,1,2#1,2#2,2}
.
The graph has a total of three nodes, and therefore contains three parts as separated by#
.
0
. Connect node
0
to both nodes
1
and
2
.1
. Connect node
1
to node
2
.2
. Connect node
2
to node
2
(itself), thus forming a self-cycle.Visually, the graph looks like the following:
1
/ \
/ \
0 --- 2
/ \
\_/
tag: BFS
/**
* Definition for undirected graph.
* class UndirectedGraphNode {
* int label;
* List<UndirectedGraphNode> neighbors;
* UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
* };
*/
public class Solution {
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if (node == null) return null;
//1. get all nodes
Set<UndirectedGraphNode> nodes = getNodes(node);
Map<UndirectedGraphNode, UndirectedGraphNode> hash = new HashMap<>();
//2. construct map
for (UndirectedGraphNode n : nodes){
hash.put(n, new UndirectedGraphNode(n.label));
}
//3. handle neighbors
for (UndirectedGraphNode n : nodes){
for (UndirectedGraphNode neighbor : n.neighbors){
hash.get(n).neighbors.add(hash.get(neighbor));
}
}
return hash.get(node);
}
private Set<UndirectedGraphNode> getNodes(UndirectedGraphNode node){
Set<UndirectedGraphNode> ans = new HashSet<>();
Queue<UndirectedGraphNode> q = new LinkedList<>();
q.offer(node);
ans.add(node);
while (!q.isEmpty()){
UndirectedGraphNode cur = q.poll();
for (UndirectedGraphNode neighbor : cur.neighbors){
if (ans.contains(neighbor)) continue;
q.offer(neighbor);
ans.add(neighbor);
}
}
return ans;
}
}