全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

LeetCode 133. 克隆图:DFS 深拷贝的正确实现方法

本文详解如何用 dfs 正确实现无向连通图的深拷贝,重点解决因忽略图中环而导致的重复节点创建问题,并提供简洁、健壮、可复用的递归解决方案。

在 LeetCode 133. Clone Graph 中,目标是为给定的连通无向图生成一个完全独立的深拷贝——即新图中每个节点及其邻接关系都需全新构造,且任意两个节点间的关系(尤其是环结构)必须与原图严格一致。常见错误(如题中原始代码)在于仅用 set 记录已访问的 val 值,却未保存对应克隆节点的引用,导致遇到已访问节点时仍新建节点,破坏图结构一致性。

核心问题在于:图可能含环,而深拷贝必须复用已创建的克隆节点,而非重复实例化。
因此,状态映射容器不能只是 visited: Set[int],而应升级为 visited: Dict[int, Node],以支持“查表复用”——当 DFS 再次抵达某 val 对应的节点时,直接返回其已有克隆体。

以下是推荐的 DFS 实现(清晰版):

"""
# 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, Dict

class Solution:
    def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
        visited: Dict[int, 'Node'] = {}

        def dfs(n: Optional['Node']) -> Optional['Node']:
            if not n:
                return None
            if n.val in visited:
                return visited[n.val]  # 复用已克隆节点,避免环导致重复创建

            clone = Node(n.val)  # 创建新节点
            visited[n.val] = clone  # 立即注册,防止后续递归重复创建

            # 递归克隆所有邻居,并追加到当前克隆节点的 neighbors 列表
            for neighbor in n.neighbors:
                clone.neighbors.append(dfs(neighbor))

            return clone

        return dfs(node)

关键设计亮点:

  • 返回式递归:dfs() 返回克隆后的节点,消除冗余参数,逻辑更内聚;
  • 即时注册:在创建 clone 后立即存入 visited,确保同一节点值在任何调用栈深度下均命中缓存;
  • 零特判:无需单独处理 node is None 或 len(node.neighbors) == 0,递归自然覆盖所有边界情况;
  • 强类型提示:显式标注 Dict[int, 'Node'] 和返回类型,提升可读性与 IDE 支持。

⚠️ 注意事项:

  • 节点 val 在题目中保证唯一(1-indexed 且无重复),故可用 val 作哈希键;若实际场景中 val 不唯一,则必须改用 id(node) 或自定义唯一标识;
  • 本解法时间复杂度为 O(N + E)(N 为节点数,E 为边数),空间复杂度为 O(N)(哈希表 + 递归栈);
  • 若需迭代式 DFS/BFS 实现,可配合栈/队列 + 同样 Dict[int, Node] 映射完成,原理一致。

该方案已通过 LeetCode 全部测试用例(包括含环图如 [[2,4],[1,3],[2,4],[1,3]]),是图深拷贝问题的标准范式。


# node  # app  #   # 递归  # int  # len  # ide  # leetcode  # 复用  # 图中  # 尤其是  # 已有  # 自定义  # 而非  # 升级为  # 如何用  # 仅用 


相关文章: 如何高效利用200m空间完成建站?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  建站主机类型有哪些?如何正确选型  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何用免费手机建站系统零基础打造专业网站?  广州美橙建站如何快速搭建多端合一网站?  平台云上自主建站:模板化设计与智能工具打造高效网站  非常酷的网站设计制作软件,酷培ai教育官方网站?  制作旅游网站html,怎样注册旅游网站?  香港网站服务器数量如何影响SEO优化效果?  香港服务器如何优化才能显著提升网站加载速度?  如何通过FTP空间快速搭建安全高效网站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  如何基于云服务器快速搭建个人网站?  Swift中swift中的switch 语句  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何在阿里云虚拟主机上快速搭建个人网站?  香港服务器租用费用高吗?如何避免常见误区?  建站之星后台密码遗忘?如何快速找回?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  动图在线制作网站有哪些,滑动动图图集怎么做?  如何获取开源自助建站系统免费下载链接?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  网站代码制作软件有哪些,如何生成自己网站的代码?  ,sp开头的版面叫什么?  如何在景安服务器上快速搭建个人网站?  ,交易猫的商品怎么发布到网站上去?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  宝塔建站助手安装配置与建站模板使用全流程解析  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  如何用5美元大硬盘VPS安全高效搭建个人网站?  ,在苏州找工作,上哪个网站比较好?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  建站主机选哪种环境更利于SEO优化?  寿县云建站:智能SEO优化与多行业模板快速上线指南  python的本地网站制作,如何创建本地站点?  如何在IIS中配置站点IP、端口及主机头?  活动邀请函制作网站有哪些,活动邀请函文案?  网站企业制作流程,用什么语言做企业网站比较好?  建站主机核心功能解析:服务器选择与网站搭建流程指南  如何在IIS中新建站点并配置端口与IP地址?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  利用JavaScript实现拖拽改变元素大小  javascript中的try catch异常捕获机制用法分析  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何在Golang中指定模块版本_使用go.mod控制版本号 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。