Clone Graph | DFS 深度优先复制图

120 阅读2分钟

题目描述

一个无向连通图中的某个节点 node,请返回该图的深拷贝(即复制一个全新的图),要求新图与原图结构完全一致,且没有任何共享的引用。

每个节点都有一个唯一的值 val,以及一个邻接表 neighbors,表示它直接连接的节点。

✅ 解题思路:DFS + 哈希表记忆

图的深拷贝本质上是 图遍历 + 拷贝结构。这里我们使用 DFS(深度优先搜索) 的方式。

我们需要解决两个关键问题:

  1. 图中有环怎么办?
    为了避免重复访问,我们用一个 Map 记录访问过的节点以及它们对应的克隆节点。

  2. 如何拷贝图结构?
    每个节点都要复制,并且将邻居们连接起来。我们在递归时一边复制,一边连边。

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 映射以及递归栈。

📣 结语

图的深拷贝是经典基础题之一,很考察图遍历基础 + 哈希结构使用能力