Worked Graph 1: Clone Graph
Given a connected undirected graph node, return a deep copy of the graph. Each node has a value and a list of neighbors.
Hidden answer: invariant, common mistake, and Python solution
Invariant: once an original node is in copies, every
future edge that reaches that original should reuse the same clone.
The common mistake is cloning neighbors before memoizing the current
node, which recurses forever on cycles.
def clone_graph(node):
if node is None:
return None
copies = {}
def dfs(original):
if original in copies:
return copies[original]
clone = Node(original.val)
copies[original] = clone
clone.neighbors = [dfs(neighbor) for neighbor in original.neighbors]
return clone
return dfs(node)