You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 133. Clone Graph:DFS实现深拷贝未通过验证求助

LeetCode 133. 克隆图深拷贝实现问题

题目描述

给定无向连通图中一个节点的引用,返回该图的深拷贝(deep copy)。
图中的每个节点包含一个整数(int)val和一个邻居节点列表(List[Node])。

class Node {
    public int val;
    public List<Node> neighbors;
}

测试用例格式:

为简化起见,每个节点的val与其索引(1-indexed)相同。例如,第一个节点val == 1,第二个节点val == 2,以此类推。

问题情况

我用DFS遍历实现深拷贝,但提交后未通过验证。尝试打印原节点和拷贝节点的值及内存地址对比,仍无法理解为何不满足题目要求。以下是我的Python实现(已注释测试用冗余代码):

"""
# 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 cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
        if not node:
            return 
        if not node.neighbors:
            return Node(node.val)
        

        ans = Node(node.val,[])
        visited = set()

        def dfs(node,copy):
            if not node or node.val in visited:
                return
            visited.add(node.val)
            neighbors = node.neighbors
            for neighbor in neighbors:
                deepcopy = Node(neighbor.val)
                copy.neighbors.append(deepcopy)

                dfs(neighbor,deepcopy)

        dfs(node,ans)
        
        # test = set()
        # def dfsTest(og,copy):
        #     if og in test:
        #         return 
            
        #     test.add(og)
        #     og_n = og.neighbors
        #     copy_n = copy.neighbors

        #     for o,c in zip(og_n,copy_n):
        #         print(o,c)  
        #         print(o.val,c.val)
        #         dfsTest(o,c)  
        
        # dfsTest(node,ans)
        return ans

错误原因分析

你的代码核心问题是重复创建同一节点的拷贝实例,没有复用已创建的节点,导致拷贝后的图结构与原图不符。比如原图中节点1和节点2互相连接,你的代码在处理节点1的邻居时创建了节点2的拷贝,而处理节点2的邻居时又会新建一个节点1的拷贝——这就导致拷贝图里存在两个不同的节点1,完全破坏了原图的连通关系。

你用visited集合只记录了节点的val是否被访问,但val只能标识节点值,无法关联到已经创建的拷贝节点。正确的做法是用字典映射原节点到对应的拷贝节点,确保每个原节点只被拷贝一次。

修正后的代码

"""
# 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 cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
        if not node:
            return None
        
        # 字典存储原节点到拷贝节点的映射,确保每个节点只拷贝一次
        node_map = {}
        
        def dfs(current_node):
            # 如果当前节点已经拷贝过,直接返回拷贝后的节点
            if current_node in node_map:
                return node_map[current_node]
            # 创建当前节点的拷贝
            copy_node = Node(current_node.val)
            node_map[current_node] = copy_node
            # 递归处理所有邻居,将邻居的拷贝加入当前节点的邻居列表
            for neighbor in current_node.neighbors:
                copy_node.neighbors.append(dfs(neighbor))
            return copy_node
        
        return dfs(node)

内容的提问来源于stack exchange,提问作者Kang_the_Conqueror

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:23:35