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

LeetCode 133克隆图:用node.val作键报错‘值为2的节点不存在’原因咨询

问题分析:Clone Graph 用val作为哈希键触发不存在节点错误

我在解决LeetCode 133题《Clone Graph》时遇到一个奇怪的错误:当用Node实例作为processed_node_map的键时,算法能正常通过;但改用node.val作为键时,会触发错误:Node with value 2 doesn't exist in the original graph.。已知两个关键条件:

  • 输入中所有节点的val值唯一
  • 触发报错的测试用例里根本没有值为2的节点

附出错代码:

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

processed_node_map = {}

class Solution:
    def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
        return self.dfs(node) if node else None

    def dfs(self, node):
        if node.val in processed_node_map:
            return processed_node_map[node.val]
        
        clone = Node(val=node.val)
        processed_node_map[node.val] = clone

        calculated_neighbors = []
        for child in node.neighbors:
            calculated_neighbors.append(self.dfs(child))

        clone.neighbors = calculated_neighbors
        
        return clone

核心原因:全局哈希表的残留污染

你把processed_node_map定义成了全局变量,这会导致不同测试用例之间的状态互相干扰:

  • 假设有第一个测试用例包含val=2的节点,处理完成后processed_node_map里会留存键为2的条目
  • 当运行第二个没有val=2节点的测试用例时,DFS过程中可能因边界逻辑或测试用例的隐性关联,代码尝试访问processed_node_map[2],但原图中不存在该节点,直接触发报错

而用Node实例作为键时,不同测试用例的节点对象完全独立,前一个测试用例的节点实例不会出现在后一个测试用例中,因此全局哈希表的残留不会影响新测试的执行。

修复方案

将processed_node_map移到cloneGraph方法内部,让它成为每个测试用例的局部变量,彻底避免跨用例的状态污染:

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']:
        processed_node_map = {}  # 改为方法内局部变量
        def dfs(node):
            if node.val in processed_node_map:
                return processed_node_map[node.val]
            
            clone = Node(val=node.val)
            processed_node_map[node.val] = clone

            calculated_neighbors = []
            for child in node.neighbors:
                calculated_neighbors.append(dfs(child))

            clone.neighbors = calculated_neighbors
            
            return clone
        return dfs(node) if node else None

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:12:40