Depth-First Search
Copy Graph
DESCRIPTION
Given a reference to a variable node which is part of an undirected, connected graph, write a function that returns an adjacency list representation of the graph in dictionary form. The keys of the adjacency list are the values of the nodes, and each value is a list of that node's neighbors' values.
This isn't a deep copy of the node objects. You're converting the node-and-pointers structure into a dictionary adjacency list that describes the same graph.
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# 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
- 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
Animated Solution
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.
Your account is free and you can post anonymously if you choose.