Text Summary
To solve this problem, utilize one key variable and follow four essential steps:
Key Variable:
The ‘checked’ variable is a map that tracks the previous node as the ‘key’ and the corresponding new node as the ‘value’:
checked = {}
Four essential steps:
- Check if the current node is ‘None’ or has been visited (present in ‘checked’). If so, return ‘None’ or the value of the checked variable for the current node:
if not node:
return None
if node in checked:
return checked[node]
- Create a new node and associate it with the current node in the ‘checked’ map:
clone = Node(node.val, [])
checked[node] = clone
- Iterate through the neighbors of the current node, recursively creating and connecting new nodes for them:
for n in node.neighbors:
clone.neighbors.append(dfs(n))
- Return the ‘clone’ variable, representing the new node:
return clone
Code Summary
"""
# Definition for a Node.
class Node(object):
def __init__(self, val = 0, neighbors = None):
self.val = val
self.neighbors = neighbors if neighbors is not None else []
"""
class Solution(object):
def cloneGraph(self, node):
"""
:type node: Node
:rtype: Node
"""
checked = {}
def dfs(node):
if not node:
return None
if node in checked:
return checked[node]
clone = Node(node.val, [])
checked[node] = clone
for n in node.neighbors:
clone.neighbors.append(dfs(n))
return clone
return dfs(node)