力扣中國 · #133

克隆图(Clone Graph)

使用 DFS 與哈希表映射實現圖的深克隆,有效處理環路與重複節點。

開啟原題 ↗
時間複雜度O(N),其中 N 為圖中節點數。每個節點和每條邊僅被訪問一次。
空間複雜度O(N),其中 N 為圖中節點數。遞迴棧深度最壞情況為 N,且 `visited` 字典儲存 N 個映射關係。
解釋模型qwen/qwen3.8-27b

解題思路

久沒寫了,有點卡,f可以直接替代cloneGraph

此解法採用深度優先搜尋(DFS)來複製圖結構。核心在於使用一個字典 visited 作為「原節點」到「克隆節點」的映射表,以處理圖中的環路並避免無限遞迴。

  1. 狀態追蹤:visited 字典記錄了已經被克隆過的節點。當遇到一個節點時,若它已存在於字典中,直接返回對應的克隆節點,確保每個節點只被克隆一次,並正確連接已存在的節點。
  2. 遞迴克隆:函數 f 首先檢查輸入節點是否為空或已訪問。若未訪問,則建立一個具有相同值但鄰居列表為空的新節點,並立即將「原節點 -> 新節點」的映射存入 visited。這一步至關重要,因為在處理鄰居之前必須先註冊當前節點,以應對自環或環路情況。
  3. 鄰居處理:遍歷原節點的鄰居列表,對每個鄰居遞迴呼叫 f,並將返回的克隆節點加入當前克隆節點的鄰居列表中。
  4. 入口點:cloneGraph 函數僅作為包裝器,直接呼叫 f 並返回結果。作者提到的「f可以直接替代cloneGraph」是指 f 包含了完整的邏輯,cloneGraph 僅需透傳參數。

通過的程式碼

"""
# Definition for a Node.
class Node:
    def __init__(self, val = 0, neighbors = None):
        self.val = val
        self.neighbors = neighbors if neighbors is not None else []
"""

from typing import Optional
class Solution:
    def __init__(self,):
        self.visited = dict()
    def f(self, node):
        if not node: return node
        if node in self.visited:
            return self.visited[node]

        clone_node = Node(node.val, [])
        self.visited[node] = clone_node

        for n in node.neighbors:
            clone_node.neighbors.append(self.f(n))
        return clone_node

    def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
        
        return self.f(node)