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.
# class IntGraphNode:# value: int# id: int# neighbors: List[IntGraphNode]def copy_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
# class IntGraphNode:# value: int# id: int# neighbors: List[IntGraphNode]def copy_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
- each call to the recursive function can access adj_list directly
- the scope of adj_list is limited to the main function, which means that other parts of the code cannot modify it.
Depth-First Search
# class IntGraphNode:# value: int# id: int# neighbors: List[IntGraphNode]def copy_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
# class IntGraphNode:# value: int# id: int# neighbors: List[IntGraphNode]def copy_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
# class IntGraphNode:# value: int# id: int# neighbors: List[IntGraphNode]def copy_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
# class IntGraphNode:# value: int# id: int# neighbors: List[IntGraphNode]def copy_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
Unlock Premium Coding Content
On This Page
Your account is free and you can post anonymously if you choose.