Given a reference of a node in a connected undirected graph, return a deep copy (clone) of the graph. Each node in the graph contains a val (int) and a list (List[Node]) of its neighbors.
给出一个无向图,让做一个deep copy
deep copy就是不是仅仅copy reference,而是重新建立一个无向图
思路:
BFS遍历节点,其中为了防止重复遍历,把遍历过节点保存在HashMap, 当节点已经存在在HashMap中就说明已经访问过了,不需要再遍历。
而且在map中用旧的节点指向copy出的新的节点,一一对应关系
遍历完之后,再建立neighbors的关系
因为所有的旧节点和新节点已经有了一一对应的关系,把HashMap中的Key,也就是旧节点遍历一遍,取每个节点的neighbors,找到neighbors中每个Node对应的新节点,添加到新的neighbors
/*
class Node {
public int val;
public List<Node> neighbors;
public Node() {}
public Node(int _val,List<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
*/
public Node cloneGraph(Node node) {
if(node == null) return node;
Queue<Node> queue = new LinkedList<>();
HashMap<Node, Node> map = new HashMap<>();
queue.offer(node);
//BFS
while(!queue.isEmpty()) {
Node tmp = queue.poll();
//旧node与copy的新node形成映射
map.put(tmp, new Node(tmp.val));
for(Node tmpNode : tmp.neighbors) {
if(!map.containsKey(tmpNode)) {
queue.offer(tmpNode);
//放进map防止重复访问,后面会覆盖新的
map.put(tmpNode, null);
}
}
}
//map中已有全部node的映射关系
for(Map.Entry<Node, Node> entry : map.entrySet()) {
//提取旧node的neighbors,装到一个新的list里
Node curNode = entry.getKey();
List<Node> neighbors = new ArrayList<>();
for(Node tmpNode : curNode.neighbors) {
//neighbors也要换成新node
neighbors.add(map.get(tmpNode));
}
map.get(curNode).neighbors = neighbors;
}
return map.get(node);
}
}