看到克隆图,自然想到遍历所有节点的算法,DFS/BFS改造下就可以了
本题中map用来保存已复制的节点(关系没有复制),同时也起到一个标记节点已访问过的作用。
/**
* Definition for undirected graph.
* class UndirectedGraphNode {
* int label;
* ArrayList<UndirectedGraphNode> neighbors;
* UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
* };
*/
public class Solution {
private HashMap<UndirectedGraphNode,UndirectedGraphNode> map = new HashMap<UndirectedGraphNode,UndirectedGraphNode>();//已复制过的节点
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
// Note: The Solution object is instantiated only once and is reused by each test case.
map.clear();
return clone(node);
}
//dfs
public UndirectedGraphNode clone(UndirectedGraphNode node){
if(node == null) return null;
UndirectedGraphNode clonedNode = new UndirectedGraphNode(node.label);
map.put(node,clonedNode);
if(node.neighbors == null||node.neighbors.size() == 0) {
return clonedNode;
}
for(UndirectedGraphNode unode:node.neighbors){
UndirectedGraphNode cloned = map.get(unode);
if(cloned == null){
UndirectedGraphNode cloneNeighborNode = clone(unode);
clonedNode.neighbors.add(cloneNeighborNode);
}else{
clonedNode.neighbors.add(cloned);
}
}
return clonedNode;
}
}