Altcademy - a Forbes magazine logo Best Coding Bootcamp 2023

Compute the Diameter of a Tree (Solved)

Introduction to Computing the Diameter of a Tree

In computer science and graph theory, trees play a crucial role in representing hierarchical relationships between objects. Trees are a special kind of graph that have no cycles and are connected. One of the important properties of a tree is its diameter, which is the longest path between any two nodes in the tree.

Computing the diameter of a tree is a common problem faced by programmers, especially when working with large datasets, network topology, or hierarchical structures. In this article, we will explain the concept of computing the diameter of a tree, provide real-world examples, and walk through solving a problem step-by-step with code examples.

Real-World Examples and Scenarios

1. Network Topology Analysis

In computer networks, the diameter of a network graph can help determine the efficiency and resilience of the network. A small diameter indicates that information can travel quickly between nodes, while a large diameter means that the network may have bottlenecks or points of failure.

2. Biological Taxonomy

In the study of biological taxonomy, trees are used to represent the hierarchical classification of organisms. The diameter of the tree can help researchers understand the evolutionary distance between species and identify potential gaps in the classification system.

3. Organizational Hierarchies

Trees can also be used to represent the hierarchical structure of an organization, with nodes representing employees or departments and edges representing reporting relationships. The diameter of the tree can provide insights into the efficiency of communication and decision-making within the organization.

Problem Scenario: Network Topology Analysis

Let's consider a computer network consisting of several routers and switches. We want to analyze the efficiency of the network by calculating its diameter.

Problem Statement

Given an undirected tree with n nodes, determine its diameter.

Formal Definition

Let T be an undirected tree with n nodes numbered from 1 to n. The tree is represented by a list of edges, where each edge is a tuple (u, v) representing a connection between nodes u and v. The diameter of the tree is the longest path between any two nodes in the tree.

Tying Problem Statement with Scenario

In the context of our network topology scenario, the nodes represent routers and switches, and the edges represent connections between them. We want to find the longest path between any two routers or switches to determine the efficiency of the network.

Solution to the Problem

The diameter of a tree can be computed using depth-first search (DFS) with two passes.

  1. Run DFS from an arbitrary starting node s to find the farthest node x.
  2. Run DFS from node x to find the farthest node y.
  3. The distance between nodes x and y is the diameter of the tree.

Let's break down the solution step by step using the network topology scenario.

Step 1: Run DFS from an arbitrary starting node

First, we will select an arbitrary node s and run DFS to find the farthest node x. To do this, we will use a helper function dfs that takes the current node u, its parent p, and the current distance d.

def dfs(u, p, d):
    global farthest_node, max_distance

    if d > max_distance:
        farthest_node = u
        max_distance = d

    for v in tree[u]:
        if v != p:
            dfs(v, u, d + 1)

Step 2: Run DFS from the farthest node x

We will run DFS again from the node x found in the previous step to find the farthest node y.

farthest_node = -1
max_distance = -1
dfs(x, -1, 0)
y = farthest_node

Step 3: Calculate the diameter of the tree

The distance between nodes x and y is the diameter of the tree.

diameter = max_distance

Code Example

Here is the complete code to compute the diameter of a tree.

def dfs(u, p, d):
    global farthest_node, max_distance

    if d > max_distance:
        farthest_node = u
        max_distance = d

    for v in tree[u]:
        if v != p:
            dfs(v, u, d + 1)


def tree_diameter(n, edges):
    global tree, farthest_node, max_distance

    tree = [[] for _ in range(n + 1)]

    for u, v in edges:
        tree[u].append(v)
        tree[v].append(u)

    farthest_node = -1
    max_distance = -1
    dfs(1, -1, 0)
    x = farthest_node

    farthest_node = -1
    max_distance = -1
    dfs(x, -1, 0)
    y = farthest_node

    diameter = max_distance
    return diameter

Explaining the Solution

The intuition behind this solution is that the longest path in a tree must pass through the farthest node from an arbitrary starting point. By running DFS twice, we ensure that we find the longest path between two nodes in the tree.

The algorithm has a time complexity of O(n), making it efficient for large trees.

Solving Similar Real-World Problems

The solution presented in this article can be applied to other real-world problems involving trees. For example, it can be used to analyze the efficiency of an organizational hierarchy or the evolutionary distance between species in a biological taxonomy.

By understanding the concept of computing the diameter of a tree and implementing the DFS-based algorithm, you will be well-equipped to tackle tree-related problems in your programming projects and applications.