133_克隆图

难度:中等

题目

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

图中的每个节点都包含它的值 val (int) 和其邻居的列表(list[Node])。

1
2
3
4
class Node {
public int val;
public List<Node> neighbors;
}

示例

img

提示

  • 节点数不超过 100 。
  • 每个节点值 Node.val 都是唯一的,1 <= Node.val <= 100。
  • 无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
  • 由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
  • 图是连通图,你可以从给定节点访问到所有节点。

解题

使用深度优先搜索的方式进行拷贝,为了防止重复添加同一个节点,用 HashMap 来存储,key 为节点,value 为深拷贝的节点。

  1. 从给定节点开始遍历图。如果某个节点已经被访问过,则返回其克隆图中的对应节点
  2. 如果当前访问的节点不在哈希表中,则创建它的克隆节点并存储在哈希表中
  3. 递归调用每个节点的邻接点。每个节点递归调用的次数等于邻接点的数量,每一次调用返回其对应邻接点的克隆节点,最终返回这些克隆邻接点的列表,将其放入对应克隆节点的邻接表中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
HashMap<Node, Node> visited = new HashMap<>();
public Node cloneGraph(Node node){
if (node==null) return node;
// 如果该节点已经被访问过,则直接从哈希表中取出对应的克隆节点返回
if (visited.containsKey(node)){
return visited.get(node);
}
// 克隆节点
Node cloneNode = new Node(node.val, new ArrayList<>());
visited.put(node, cloneNode);
// 遍历节点的邻居并更新克隆节点的邻居列表
for (Node neighbor: node.neighbors){
cloneNode.neighbors.add(cloneGraph(neighbor));
}
return cloneNode;
}