這道題就是遍歷整個圖,所以遍歷時候要記錄已經訪問點(
否則就是死循環
);用一個字典記錄 ,採用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;
}