无向图的复制
我们使用#作为每个节点的分隔符,以及作为节点标签和节点的每个邻居的分隔符。作为例子,考虑序列化图{0,1,2#1,2#2,2}。
用深度优先DFS遍历,复制图
用map保存新旧值的映射关系
class UndirectedGraphNode{
int label;
ArrayList<UndirectedGraphNode> neighbors;
UndirectedGraphNode(int x){
this.label=x;
neighbors=new ArrayList<UndirectedGraphNode>();
}
}
private HashMap<Integer,UndirectedGraphNode> map=new HashMap<>();
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
return clone(node);
}
public UndirectedGraphNode clone(UndirectedGraphNode node){
if(node==null)
return null;
if (map.containsKey(node.label)){
return map.get(node.label);
}
UndirectedGraphNode clonenode=new UndirectedGraphNode(node.label);//创建一个新节点(复制)
map.put(clonenode.label,clonenode); //赋值
for(UndirectedGraphNode neighbor:node.neighbors){//遍历原节点的邻接点
clonenode.neighbors.add(clone(neighbor));//(DFS)递归创建、赋值邻接点
}
return clonenode;
}