133. Clone Graph
Clone an undirected graph. Each node in the graph contains a label
and a list of its neighbors
.
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 #
.
- First node is labeled as
0
. Connect node0
to both nodes1
and2
. - Second node is labeled as
1
. Connect node1
to node2
. Third node is labeled as
2
. Connect node2
to node2
(itself), thus forming a self-cycle.Visually, the graph looks like the following:
1
/ \
/ \
0 --- 2
/ \
\_/
Solution
(1) Java
/**
* 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;
}
Queue<UndirectedGraphNode> q = new LinkedList<>();
Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>();
UndirectedGraphNode cnode = new UndirectedGraphNode(node.label);
map.put(node, cnode);
q.offer(node);
while (q.size() > 0) {
UndirectedGraphNode opnode = q.poll();
List<UndirectedGraphNode> neighbors = opnode.neighbors;
for (UndirectedGraphNode pnode : neighbors) {
if (!map.containsKey(pnode)) {
UndirectedGraphNode pcnode = new UndirectedGraphNode(pnode.label);
map.put(pnode, pcnode);
q.offer(pnode);
}
map.get(opnode).neighbors.add(map.get(pnode));
}
}
return cnode;
}
}
(2) Python
# Definition for a undirected graph node
# class UndirectedGraphNode:
# def __init__(self, x):
# self.label = x
# self.neighbors = []
class Solution:
# @param node, a undirected graph node
# @return a undirected graph node
def cloneGraph(self, node):
def clone(pnode):
if not pnode:
return None
if pnode in cache:
return cache[pnode]
pcnode = UndirectedGraphNode(pnode.label)
cache[pnode] = pcnode
for ppcode in pnode.neighbors:
cache[pnode].neighbors.append(clone(ppcode))
return pcnode
cache = {}
return clone(node)
(3) Scala