Given the head of a graph, return a deep copy (clone) of the graph. Each node in the graph contains a label (int) and a list (List[UndirectedGraphNode]) of its neighbors. There is an edge between the given node and each of the nodes in its neighbors.
OJ’s undirected graph serialization (so you can understand error output):
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 node 0 to both nodes 1 and 2.
Second node is labeled as 1. Connect node 1 to node 2.
Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.
思路:
- 一个点到所有点:由点及面,用宽度优先算法找出邻居,存进ArrayList中
- copy nodes:用hashmap建立映射,old->new
- copy neighbor:(1). 找到所有的点
(2).建立新点(用mapping.get(node)取出新点)
(3). for-each newNeighbor:node.neighbor,先实例化,再添加到newNode.neighbors.add()
/**
* 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) {
//1.from one node to find all nodes(BFS)
//2.copy all nodes
//3.copy all edges
if(node==null){
return node;
}
//use BFS to access all nodes
ArrayList<UndirectedGraphNode> nodes=getNodes(node);
//use hashmap to store old->new nodes
HashMap<UndirectedGraphNode,UndirectedGraphNode> mapping=new HashMap<>();
for(UndirectedGraphNode n: nodes){
mapping.put(n, new UndirectedGraphNode(n.label));
}
//copy edges
for(UndirectedGraphNode n:nodes){
//构建新点
UndirectedGraphNode newNodes=mapping.get(n);
for(UndirectedGraphNode neighbor:n.neighbors){
//先实例化,再在新点添加新neighbor
UndirectedGraphNode newNeighbor = mapping.get(neighbor);
newNodes.neighbors.add(newNeighbor);
}
}
return mapping.get(node);
}
private ArrayList<UndirectedGraphNode> getNodes(UndirectedGraphNode node){
Queue<UndirectedGraphNode> queue=new LinkedList<>();
HashSet<UndirectedGraphNode> set=new HashSet<>();
//using hashset to elimate duplicate element
//node->neighbor 发散到自己的临界点
queue.offer(node);
set.add(node);
while(!queue.isEmpty()){
UndirectedGraphNode first=queue.poll();
for(UndirectedGraphNode neighbor:first.neighbors){
if(!set.contains(neighbor)){
set.add(neighbor);
queue.offer(neighbor);
}
}
}
return new ArrayList<UndirectedGraphNode>(set);
}
}