Depth-First Search
Copy Graph
DESCRIPTION
Given a reference to a variable node which is part of an undirected, connected graph, write a function to return a copy of the graph as an adjacency list in dictionary form. The keys of the adjacency list are the values of the nodes, and the values are the neighbors of the nodes.
node is an instance of the following class, where neighbors is a list of references to other nodes in the graph (also of type IntGraphNode):
class IntGraphNode: def __init__(self, value = 0, neighbors = None): self.value = value self.neighbors = neighbors if neighbors is not None else []
Example 1:
Input:
node = IntGraphNode(1, [IntGraphNode(2), IntGraphNode(3)])
Output:
>>> copy_graph(node) {1: [2, 3], 2: [1], 3: [1]}
Example 2: Input:
n1 = IntGraphNode(1) n2 = IntGraphNode(2) n3 = IntGraphNode(3) n4 = IntGraphNode(4) n1.neighbors = [n2, n4] n2.neighbors = [n1, n3] n3.neighbors = [n2, n4] n4.neighbors = [n1, n3]
Output:
>>> copy_graph(n1) {1: [2, 4], 2: [1, 3], 3: [2, 4], 4: [1, 3]}
Explanation
- Add the value of the node as a key in the adjacency list, and a list of its neighbor's values as the value in the dictionary.
- Recursively call the dfs function on each neighbor of the node.
def clone_graph(node):adj_list = {}def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)if node:dfs(node)return adj_list
Initialization
def clone_graph(node):adj_list = {}def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)if node:dfs(node)return adj_list
copy graph
0 / 2
Depth-First Search
def clone_graph(node):adj_list = {}def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)if node:dfs(node)return adj_list
def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)
recursive call
0 / 1
def clone_graph(node):adj_list = {}def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)if node:dfs(node)return adj_list
def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)
add to adj_list
0 / 5
def clone_graph(node):adj_list = {}def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)if node:dfs(node)return adj_list
def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)
def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)
def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)
recursive call
0 / 2
Animated Solution
def clone_graph(node):adj_list = {}def dfs(node):if node.value in adj_list:returnadj_list[node.value] = [n.value for n in node.neighbors]for neighbor in node.neighbors:dfs(neighbor)if node:dfs(node)return adj_list
copy graph
0 / 26
Test Your Knowledge
Login to take the complexity quiz and track your progress
Complexity Analysis
Time Complexity: O(N + M) where N is the number of nodes and M is the number of edges in the graph for the depth-first search traversal.
Space Complexity: O(N + M) where N is the number of nodes and M is the number of edges in the graph. The space complexity is due to the adjacency list that stores the graph structure: each of the N nodes is stored once as keys, and each of the M edges is stored as part of the values in the dictionary.
Mark as read
Your account is free and you can post anonymously if you choose.