Bird
Raised Fist0
DSA Cprogramming~5 mins

Diameter of Binary Tree in DSA C - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Diameter of Binary Tree
O(n)
Understanding Time Complexity

We want to know how the time to find the diameter of a binary tree grows as the tree gets bigger.

The question is: how many steps does it take to check all nodes and find the longest path?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


int max(int a, int b) {
    return (a > b) ? a : b;
}

int height(struct Node* root, int* diameter) {
    if (!root) return 0;
    int leftHeight = height(root->left, diameter);
    int rightHeight = height(root->right, diameter);
    *diameter = max(*diameter, leftHeight + rightHeight);
    return max(leftHeight, rightHeight) + 1;
}

int diameterOfBinaryTree(struct Node* root) {
    int diameter = 0;
    height(root, &diameter);
    return diameter;
}
    

This code finds the diameter by calculating the height of each subtree and updating the longest path found.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Recursive calls to visit each node once.
  • How many times: Each node is visited exactly once to calculate heights and update diameter.
How Execution Grows With Input

As the number of nodes grows, the function visits each node once, doing a small fixed amount of work per node.

Input Size (n)Approx. Operations
10About 10 visits
100About 100 visits
1000About 1000 visits

Pattern observation: The work grows linearly with the number of nodes.

Final Time Complexity

Time Complexity: O(n)

This means the time to find the diameter grows directly in proportion to the number of nodes in the tree.

Common Mistake

[X] Wrong: "The diameter calculation takes more than linear time because it checks many paths repeatedly."

[OK] Correct: The code visits each node once, calculating height and updating diameter on the fly, so it does not repeat work unnecessarily.

Interview Connect

Understanding this helps you explain how recursion can efficiently solve tree problems by visiting nodes once, a key skill in many coding challenges.

Self-Check

"What if the code recalculated height separately for left and right subtrees without storing results? How would the time complexity change?"

Practice

(1/5)
1. What does the diameter of a binary tree represent?
easy
A. The total number of nodes in the tree
B. The height of the tree
C. The length of the longest path between any two nodes in the tree
D. The number of leaf nodes in the tree

Solution

  1. Step 1: Understand the diameter concept

    The diameter is the longest path between any two nodes, which may or may not pass through the root.
  2. Step 2: Differentiate from height and node count

    Height is longest path from root to leaf, leaf count is number of leaves, total nodes is size. Diameter is distinct.
  3. Final Answer:

    The length of the longest path between any two nodes in the tree -> Option C
  4. Quick Check:

    Diameter = longest path length [OK]
Hint: Diameter is longest path, not height or node count [OK]
Common Mistakes:
  • Confusing diameter with height
  • Thinking diameter counts nodes instead of edges
  • Assuming diameter always passes through root
2. Which of the following C function signatures is correct for a helper function that returns the height of a binary tree node for diameter calculation?
easy
A. int height(struct Node* root);
B. void height(struct Node root);
C. int height(Node root);
D. int height(struct Node root);

Solution

  1. Step 1: Check parameter type for tree node

    In C, tree nodes are passed as pointers to struct Node, so parameter should be struct Node* root.
  2. Step 2: Check return type and parameter correctness

    Height returns int, so return type int is correct. Passing pointer is correct, not struct by value.
  3. Final Answer:

    int height(struct Node* root); -> Option A
  4. Quick Check:

    Pointer parameter and int return type [OK]
Hint: Use pointer to struct Node for tree nodes in C [OK]
Common Mistakes:
  • Passing struct Node by value instead of pointer
  • Using void return type instead of int
  • Missing struct keyword in parameter
3. What is the output of the following C code snippet that calculates the diameter of a binary tree?
struct Node {
  int data;
  struct Node* left;
  struct Node* right;
};

int height(struct Node* root) {
  if (!root) return 0;
  int leftHeight = height(root->left);
  int rightHeight = height(root->right);
  return 1 + (leftHeight > rightHeight ? leftHeight : rightHeight);
}

int diameter(struct Node* root) {
  if (!root) return 0;
  int leftHeight = height(root->left);
  int rightHeight = height(root->right);
  int leftDiameter = diameter(root->left);
  int rightDiameter = diameter(root->right);
  int maxDiameter = leftHeight + rightHeight + 1;
  if (leftDiameter > maxDiameter) maxDiameter = leftDiameter;
  if (rightDiameter > maxDiameter) maxDiameter = rightDiameter;
  return maxDiameter;
}

int main() {
  struct Node n1 = {1, NULL, NULL};
  struct Node n2 = {2, NULL, NULL};
  struct Node n3 = {3, &n1, &n2};
  printf("%d", diameter(&n3));
  return 0;
}
medium
A. 1
B. 2
C. 4
D. 3

Solution

  1. Step 1: Analyze tree structure

    Root n3 has two children n1 and n2, both leaves. Height of left and right subtree is 1 each.
  2. Step 2: Calculate diameter

    Diameter = max of (leftHeight + rightHeight + 1, leftDiameter, rightDiameter) = max(1+1+1, 1, 1) = 3.
  3. Final Answer:

    3 -> Option D
  4. Quick Check:

    Diameter = 3 nodes in longest path [OK]
Hint: Diameter = max(leftHeight + rightHeight + 1, leftDiameter, rightDiameter) [OK]
Common Mistakes:
  • Confusing diameter with height
  • Forgetting to add 1 for root node in diameter
  • Using height instead of diameter in comparisons
4. Identify the bug in this C function that attempts to compute the diameter of a binary tree:
int diameter(struct Node* root) {
  if (!root) return 0;
  int leftHeight = height(root->left);
  int rightHeight = height(root->right);
  int leftDiameter = diameter(root->left);
  int rightDiameter = diameter(root->right);
  int maxDiameter = leftHeight + rightHeight;
  if (leftDiameter > maxDiameter) maxDiameter = leftDiameter;
  if (rightDiameter > maxDiameter) maxDiameter = rightDiameter;
  return maxDiameter;
}
medium
A. height function is not called correctly
B. maxDiameter should be leftHeight + rightHeight + 1
C. Function should return height, not diameter
D. Missing base case for leaf nodes

Solution

  1. Step 1: Check diameter calculation formula

    Diameter includes edges between nodes, so it should add 1 for the root node connecting left and right paths.
  2. Step 2: Identify missing +1 in maxDiameter

    Current code misses +1, so maxDiameter undercounts by 1.
  3. Final Answer:

    maxDiameter should be leftHeight + rightHeight + 1 -> Option B
  4. Quick Check:

    Diameter = leftHeight + rightHeight + 1 [OK]
Hint: Add 1 to sum of heights for diameter at root [OK]
Common Mistakes:
  • Omitting +1 in diameter calculation
  • Confusing height and diameter returns
  • Not handling null root base case
5. Given a binary tree where each node stores an integer, how would you modify the diameter calculation to find the diameter based on the sum of node values along the longest path instead of the number of nodes?
hard
A. Change height function to return max sum of node values from root to leaf, and update diameter to sum left and right max sums plus root's value
B. Use the existing diameter function but multiply the result by the root node's value
C. Replace all node values with 1 and then calculate diameter normally
D. Calculate diameter normally and then add all node values in the tree separately

Solution

  1. Step 1: Modify height to return max sum path

    Instead of counting nodes, height returns max sum of node values from root to leaf recursively.
  2. Step 2: Update diameter to sum left and right max sums plus root value

    Diameter becomes max of leftDiameter, rightDiameter, and leftSum + rightSum + root's value.
  3. Final Answer:

    Change height function to return max sum of node values from root to leaf, and update diameter to sum left and right max sums plus root's value -> Option A
  4. Quick Check:

    Diameter by sum = max path sum through root [OK]
Hint: Use max sum path instead of node count for diameter sum [OK]
Common Mistakes:
  • Multiplying diameter by root value incorrectly
  • Ignoring node values in diameter calculation
  • Adding all node values separately instead of path sums
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard