题目描述
一个无向连通图中的某个节点 node,请返回该图的深拷贝(即复制一个全新的图),要求新图与原图结构完全一致,且没有任何共享的引用。
每个节点都有一个唯一的值
val,以及一个邻接表neighbors,表示它直接连接的节点。
✅ 解题思路:DFS + 哈希表记忆
图的深拷贝本质上是 图遍历 + 拷贝结构。这里我们使用 DFS(深度优先搜索) 的方式。
我们需要解决两个关键问题:
-
图中有环怎么办?
为了避免重复访问,我们用一个Map记录访问过的节点以及它们对应的克隆节点。 -
如何拷贝图结构?
每个节点都要复制,并且将邻居们连接起来。我们在递归时一边复制,一边连边。
class Node { public int val; public List neighbors;
public Node(int val) {
this.val = val;
neighbors = new ArrayList<>();
}
}
public Node cloneGraph(Node node) { if (node == null) return null;
Map<Node, Node> visited = new HashMap<>();
return dfs(node, visited);
}
private Node dfs(Node node, Map<Node, Node> visited) { if (visited.containsKey(node)) { return visited.get(node); }
Node clone = new Node(node.val);
visited.put(node, clone);
for (Node neighbor : node.neighbors) {
clone.neighbors.add(dfs(neighbor, visited));
}
return clone;
}
详解
| 步骤 | 说明 |
|---|---|
| 1️⃣ | 处理空图的情况 |
| 2️⃣ | 使用 visited 映射,避免重复访问 |
| 3️⃣ | 每次遇到新节点,就创建一个新的克隆节点 |
| 4️⃣ | 递归处理所有邻居,并连接克隆图中的边 |
| 5️⃣ | 返回克隆后的节点 |
| 节点 |
|---|
🧪 示例图
原图:
lua
复制编辑
1 -- 2
| |
4 -- 3
复制后的图结构一致,但每个节点都是新对象,没有任何共享。
📌 时间与空间复杂度
- 时间复杂度:O(N)
每个节点访问一次,每条边处理一次。 - 空间复杂度:O(N)
需要存储visited映射以及递归栈。
📣 结语
图的深拷贝是经典基础题之一,很考察图遍历基础 + 哈希结构使用能力。