Python Coding Test Course, Finding the Parent of a Tree

Hello! In this post, we will tackle an algorithm problem involving tree-structured data. Through the problem “Finding the Parent of a Tree”, we will understand trees and enhance our Python programming skills. The tree structure is one of the essential concepts in computer science and is widely applied in various fields such as databases, file systems, and website structures.

Problem Description

Problem: Write a function to find the parent node of a given vertex. A tree is a nonlinear data structure composed of nodes and edges, where each node can have zero or more child nodes. The input will provide the number of nodes and the parent node information for each node. We need to create a function that returns the parent node of a specific node.

Input Format:
– The first line contains the number of nodes N (1 ≤ N ≤ 100,000).
– The next N-1 lines each contain two integers A and B, indicating that A is the parent of B.

Output Format: Output the parent node number of a specific node.

Solution Approach

To solve this problem, we must first be able to form the tree structure based on the given information. We will follow the steps below to resolve the issue.

Step 1: Choose Data Structure

We will use a dictionary to implement the tree. We will use the node number as the key and the corresponding parent node as the value. This way, we can efficiently store the given relationships and quickly find the parent node.

Step 2: Process Input Data

We will read the input data and create the tree structure. We will take the number of nodes as input and add parent-child relationships over N-1 lines. This will allow us to construct the entire tree.

Step 3: Find Parent Node

To find the parent node of a specific node, we can directly query the dictionary we created earlier for that node’s parent. This can be done in constant time (`O(1)`).

Step 4: Write Function

Based on the above discussions, let’s write a Python function. Below is the code for solving the problem:


def find_parent(n, edges, query_node):
    # Dictionary to store parent node information
    parent = {}
    
    # Creating the dictionary based on the given relationships
    for a, b in edges:
        parent[b] = a
        
    # Return the parent node when requested for a specific node
    return parent.get(query_node, None)

# Example input
n = 7  # Number of nodes
edges = [(1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (3, 7)]  # Parent-child relationships
query_node = 4  # Node to find the parent of

# Find parent node
print(find_parent(n, edges, query_node))

Complete Code


def find_parent(n, edges, query_node):
    parent = {}
    
    # Storing relationships in a dictionary
    for a, b in edges:
        parent[b] = a
    
    return parent.get(query_node, None)

if __name__ == "__main__":
    n = int(input("Enter the number of nodes: "))
    edges = []
    for _ in range(n - 1):
        a, b = map(int, input("Enter the parent and child relationship (e.g., 'A B'): ").split())
        edges.append((a, b))
    
    query_node = int(input("Enter the node number for which you want to find the parent: "))
    result = find_parent(n, edges, query_node)
    
    if result is not None:
        print(f"The parent of node {query_node} is {result}.")
    else:
        print(f"The parent of node {query_node} cannot be found.")

Analysis of the Solution Process

The above code solves the problem in the following structure:

  • Efficiently stores parent node information using a dictionary.
  • Forms the tree structure based on the given relationships.
  • Allows for quick lookup of parent nodes for specific nodes.

Complexity Analysis

– Time Complexity: `O(N)` \- Stores parent node relationships proportional to the number of nodes (N).
– Space Complexity: `O(N)` \- Uses a dictionary to store node information.

Conclusion

In this post, we learned about a basic algorithm related to tree structures through the problem of “Finding the Parent of a Tree.” Trees are increasingly used in data science and software development as an efficient way to explore and store data. I believe this problem has provided a great foundation for understanding trees. In the next post, we will tackle more complex tree problems. Thank you!