这道题就是遍历整个图,所以遍历时候要记录已经访问点(
否则就是死循环
);用一个字典记录 ,采用dfs
public Node cloneGraph(Node node) {
Map<Node, Node> lookup = new HashMap<>();
return dfs(node, lookup);
}
//这道题就是遍历整个图
//所以遍历时候要记录已经访问点
//我们用一个字典记录
private Node dfs(Node node, Map<Node,Node> lookup) {
if (node == null) return null;
//在这里递归可以跳出;使用一个HashMap存储所有已经被范文和复制的节点。HashMap中的key是原始图中的节点,value是克隆图中的对应节点,
// 如果某个节点已经被访问过,则返回其克隆图中对应节点
//给定边 A - B,表示 A 能连接到 B,且 B 能连接到 A。如果对访问过的节点不做标记,则会陷入死循环中。
if (lookup.containsKey(node)) return lookup.get(node);
Node clone = new Node(node.val, new ArrayList<>());
lookup.put(node, clone);
//在这里不断递归
for (Node n : node.neighbors)clone.neighbors.add(dfs(n,lookup));
return clone;
}