0.基础知识
1.深拷贝浅拷贝
https://blog.csdn.net/qq_27552845/article/details/105605719
2.BFS,DFS,图
1.题目描述
2.分析
neighbors 是一个装 Node 的 list ,因为对象的话,java 变量都存储的是引用,所以复制的话要新 new 一个 Node 放到 neighbors。这个题其实就是对图进行一个遍历,通过 BFS 或者 DFS。需要解决的问题就是怎么添加当前节点的 neighbors,因为遍历当前节点的时候,它的邻居节点可能还没有生成
3.解法1:BFS
Hashmapkey是原始节点,value是新建的对应节点。
4.解法2:DFS
/*
// 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 null;
}
Map<Node,Node> visited = new HashMap<>();
return dfs(node,visited);
}
public Node dfs(Node node,Map<Node,Node> visited){
// if(node == null){
// return null;
// }
//1.说明已经被访问过了,直接返回key对应的value节点
if(visited.containsKey(node)){
return visited.get(node);
}
//2.说明没被访问过,就新建一个,并放入visied中
Node temp = new Node(node.val,new ArrayList<>());
visited.put(node,temp);
//3.遍历当前节点的邻居列表,将新建的节点(以node为基础建立的空的)的邻居列表添加上cur dfs后返回的对应cur对应建立的新的节点。
//cur是原始节点,需要以cur为基础去建立新的节点,就是dfs的返回,而在进入到新的dfs之后,又会根据这个cur的neighbors进行再一次的遍历深入,一直遍历到底部,说明遍历完了,就是下一个个节点有被访问过的记录了开始返回
//---对每个邻居节点进行dfs,这样就能根据当前的节点继续深入到下一次的节点里面,最后一层层返回,到这一步的时候返回的就是cur对应建立的value节点。
//通常dfs只要判断回溯条件即可,但是这儿的话就在每次dfs后返回了一个没访问过的节点(temp)对应的新建节点。
for(Node cur:node.neighbors){
temp.neighbors.add(dfs(cur,visited));
}
return temp;
}
}