全网整合营销服务商

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

免费咨询热线: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  # 复用  # 图中  # 尤其是  # 已有  # 自定义  # 而非  # 升级为  # 如何用  # 仅用 


相关文章: 我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  如何在IIS服务器上快速部署高效网站?  郑州企业网站制作公司,郑州招聘网站有哪些?  动图在线制作网站有哪些,滑动动图图集怎么做?  潮流网站制作头像软件下载,适合母子的网名有哪些?  XML的“混合内容”是什么 怎么用DTD或XSD定义  电脑免费海报制作网站推荐,招聘海报哪个网站多?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  学校为何禁止电信移动建设网站?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何挑选最适合建站的高性能VPS主机?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  定制建站流程步骤详解:一站式方案设计与开发指南  如何在云服务器上快速搭建个人网站?  制作网页的网站有哪些,电脑上怎么做网页?  如何配置WinSCP新建站点的密钥验证步骤?  如何通过wdcp面板快速创建网站?  如何在云主机快速搭建网站站点?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何在阿里云虚拟服务器快速搭建网站?  c# 在高并发场景下,委托和接口调用的性能对比  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  详解jQuery停止动画——stop()方法的使用  表情包在线制作网站免费,表情包怎么弄?  如何设计高效校园网站?  C#如何在一个XML文件中查找并替换文本内容  教学网站制作软件,学习*后期制作的网站有哪些?  盐城做公司网站,江苏电子版退休证办理流程?  h5网站制作工具有哪些,h5页面制作工具有哪些?  网页设计网站制作软件,microsoft office哪个可以创建网页?  如何用VPS主机快速搭建个人网站?  安徽网站建设与外贸建站服务专业定制方案  如何用已有域名快速搭建网站?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  安云自助建站系统如何快速提升SEO排名?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  建站之星微信建站一键生成小程序+多端营销系统  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  大连网站设计制作招聘信息,大连投诉网站有哪些?  北京企业网站设计制作公司,北京铁路集团官方网站?  建站之星在线客服如何快速接入解答?  建站主机选购指南与交易推荐:核心配置解析  制作电商网页,电商供应链怎么做?  如何配置FTP站点权限与安全设置?  建站之星如何助力网站排名飙升?揭秘高效技巧  javascript基本数据类型及类型检测常用方法小结  家具网站制作软件,家具厂怎么跑业务?  营销式网站制作方案,销售哪个网站招聘效果最好? 

您的项目需求

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