题目描述
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。
class Node {
public int val;
public List neighbors;
}
样例描述
思路
模拟 + 图的遍历
- 图的遍历与树的遍历就一点不同,可能有环出现重复,只需要判断是否遍历过就行。
- 将原来的和克隆的做一个映射即可。
代码
/*
// 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> visited = new HashMap<>();
public Node cloneGraph(Node node) {
if (node == null) return null;
return dfs(node);
}
public Node dfs(Node node) {
//如果已经包含克隆过的结点,就直接取出返回
if (visited.containsKey(node)) return visited.get(node);
//先克隆结点,并建立结点与其克隆结点的映射
Node clone = new Node(node.val);
visited.put(node, clone);
//克隆边,也就是与邻居结点的边
for (Node vtx: node.neighbors) {
clone.neighbors.add(dfs(vtx));
}
return clone;
}
}