题目描述:
思路:图可以深度优先或广度优先来遍历,每次遍历一个新顶点都要新创建一个一样的克隆顶点。可以用原顶点作为key,克隆顶点作为value,用一个map来存储已经遍历过的顶点,避免陷入死循环。
首先深度优先遍历:
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> neighbors;
public Node() {
val = 0;
neighbors = new ArrayList<Node>();
}
public Node(int _val) {
val = _val;
neighbors = new ArrayList<Node>();
}
public Node(int _val, ArrayList<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
*/
class Solution {
HashMap<Node,Node> map=new HashMap<>();
public Node cloneGraph(Node node) {
//如果为空返回
if(node==null)return node;
//如果已存在,返回已存在的新顶点
if(map.containsKey(node))return map.get(node);
//创建克隆顶点
Node newNode=new Node(node.val,new ArrayList<Node>()); 添加到map中
map.put(node,newNode);
//更新克隆顶点的相邻顶点
for(Node neighbor:node.neighbors){
newNode.neighbors.add(cloneGraph(neighbor));
}
return newNode;
}
}
广度优先:
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> neighbors;
public Node() {
val = 0;
neighbors = new ArrayList<Node>();
}
public Node(int _val) {
val = _val;
neighbors = new ArrayList<Node>();
}
public Node(int _val, ArrayList<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
*/
class Solution {
public Node cloneGraph(Node node) {
if(node==null)return node;
HashMap<Node,Node> map=new HashMap<>();
Queue<Node> queue=new LinkedList();
//创建克隆顶点放入map
map.put(node,new Node(node.val,new ArrayList<Node>()));
//第一个顶点入队列
queue.add(node);
while(!queue.isEmpty()){
//弹出队头顶点
Node tem=queue.remove();
//遍历该顶点相邻顶点
for(Node neighbor : tem.neighbors){
//未遍历过
if(!map.containsKey(neighbor)){
//放入map
map.put(neighbor,new Node(neighbor.val,new ArrayList<Node>()));
//加入队列
queue.add(neighbor);
}
//更新相邻顶点
map.get(tem).neighbors.add(map.get(neighbor));
}
}
return map.get(node);
}
}