def clone_graph(node):
if not node: return None
visited={}
def clone(n):
if n in visited: return visited[n]
copy=type('Node',(),{'val':n.val,'neighbors':[]})()
visited[n]=copy
for nb in n.neighbors:
copy.neighbors.append(clone(nb))
return copy
return clone(node)
public Node cloneGraph(Node node){
if(node==null) return null;
Map<Node,Node> visited=new HashMap<>();
return clone(node,visited);
}
Node clone(Node n,Map<Node,Node> visited){
if(visited.containsKey(n)) return visited.get(n);
Node copy=new Node(n.val);
visited.put(n,copy);
for(Node nb:n.neighbors) copy.neighbors.add(clone(nb,visited));
return copy;
}
Python closure captures visited. Java passes as parameter. Memo pattern identical.
def clone_graph(node):
if not node: return None
visited={}
def clone(n):
if n in visited: return visited[n]
copy=type('Node',(),{'val':n.val,'neighbors':[]})()
visited[n]=copy
for nb in n.neighbors:
copy.neighbors.append(clone(nb))
return copy
return clone(node)
public Node cloneGraph(Node node){
if(node==null) return null;
Map<Node,Node> visited=new HashMap<>();
return clone(node,visited);
}
Node clone(Node n,Map<Node,Node> visited){
if(visited.containsKey(n)) return visited.get(n);
Node copy=new Node(n.val);
visited.put(n,copy);
for(Node nb:n.neighbors) copy.neighbors.add(clone(nb,visited));
return copy;
}
1. DFS with visited map 2. Clone before recursing