🧠
Brute Force (Pure Recursion with Repeated Height Computations)
💡 This approach exists to show the naive way of solving the problem by directly implementing the definition, which helps understand the problem deeply before optimizing.
Intuition
For each node, compute the diameter by checking the longest path through it (sum of left and right subtree heights) and recursively compute diameters of left and right subtrees.
Algorithm
- Define a function to compute the height of a subtree rooted at a node.
- For each node, compute the diameter as the sum of heights of left and right subtrees.
- Recursively compute the diameter for left and right subtrees.
- Return the maximum diameter found.
💡 The challenge is that height computations are repeated many times, making the algorithm inefficient.
Recurrence:diameter(node) = max(diameter(left), diameter(right), height(left) + height(right))
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def height(node):
if not node:
return 0
return 1 + max(height(node.left), height(node.right))
def diameterOfBinaryTree(root):
if not root:
return 0
left_height = height(root.left)
right_height = height(root.right)
left_diameter = diameterOfBinaryTree(root.left)
right_diameter = diameterOfBinaryTree(root.right)
return max(left_height + right_height, max(left_diameter, right_diameter))
# Example usage:
if __name__ == '__main__':
root = TreeNode(1, TreeNode(2, TreeNode(4), TreeNode(5)), TreeNode(3))
print(diameterOfBinaryTree(root)) # Output: 3
Line Notes
def height(node):Defines a helper to compute subtree height, which is used repeatedly
if not node:Base case: height of empty subtree is 0
return 1 + max(height(node.left), height(node.right))Height is 1 plus max height of children
left_height = height(root.left)Compute left subtree height for diameter calculation
right_height = height(root.right)Compute right subtree height for diameter calculation
left_diameter = diameterOfBinaryTree(root.left)Recursively compute diameter in left subtree
right_diameter = diameterOfBinaryTree(root.right)Recursively compute diameter in right subtree
return max(left_height + right_height, max(left_diameter, right_diameter))Diameter is max of path through root or in subtrees
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int x) { val = x; }
}
public class Solution {
public int height(TreeNode node) {
if (node == null) return 0;
return 1 + Math.max(height(node.left), height(node.right));
}
public int diameterOfBinaryTree(TreeNode root) {
if (root == null) return 0;
int leftHeight = height(root.left);
int rightHeight = height(root.right);
int leftDiameter = diameterOfBinaryTree(root.left);
int rightDiameter = diameterOfBinaryTree(root.right);
return Math.max(leftHeight + rightHeight, Math.max(leftDiameter, rightDiameter));
}
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
Solution sol = new Solution();
System.out.println(sol.diameterOfBinaryTree(root)); // Output: 3
}
}
Line Notes
public int height(TreeNode node)Helper method to compute height of subtree
if (node == null) return 0;Base case for empty subtree
return 1 + Math.max(height(node.left), height(node.right));Height is 1 plus max height of children
int leftHeight = height(root.left);Compute left subtree height for diameter
int rightHeight = height(root.right);Compute right subtree height for diameter
int leftDiameter = diameterOfBinaryTree(root.left);Recursively compute left subtree diameter
int rightDiameter = diameterOfBinaryTree(root.right);Recursively compute right subtree diameter
return Math.max(leftHeight + rightHeight, Math.max(leftDiameter, rightDiameter));Return max diameter among three candidates
#include <iostream>
#include <algorithm>
using namespace std;
struct TreeNode {
int val;
TreeNode *left, *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
int height(TreeNode* node) {
if (!node) return 0;
return 1 + max(height(node->left), height(node->right));
}
int diameterOfBinaryTree(TreeNode* root) {
if (!root) return 0;
int leftHeight = height(root->left);
int rightHeight = height(root->right);
int leftDiameter = diameterOfBinaryTree(root->left);
int rightDiameter = diameterOfBinaryTree(root->right);
return max(leftHeight + rightHeight, max(leftDiameter, rightDiameter));
}
int main() {
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
cout << diameterOfBinaryTree(root) << endl; // Output: 3
return 0;
}
Line Notes
int height(TreeNode* node)Helper function to compute height of subtree
if (!node) return 0;Base case for empty subtree
return 1 + max(height(node->left), height(node->right));Height is 1 plus max height of children
int leftHeight = height(root->left);Compute left subtree height for diameter
int rightHeight = height(root->right);Compute right subtree height for diameter
int leftDiameter = diameterOfBinaryTree(root->left);Recursively compute left subtree diameter
int rightDiameter = diameterOfBinaryTree(root->right);Recursively compute right subtree diameter
return max(leftHeight + rightHeight, max(leftDiameter, rightDiameter));Return max diameter among three candidates
function TreeNode(val, left = null, right = null) {
this.val = val;
this.left = left;
this.right = right;
}
function height(node) {
if (!node) return 0;
return 1 + Math.max(height(node.left), height(node.right));
}
function diameterOfBinaryTree(root) {
if (!root) return 0;
const leftHeight = height(root.left);
const rightHeight = height(root.right);
const leftDiameter = diameterOfBinaryTree(root.left);
const rightDiameter = diameterOfBinaryTree(root.right);
return Math.max(leftHeight + rightHeight, Math.max(leftDiameter, rightDiameter));
}
// Example usage:
const root = new TreeNode(1,
new TreeNode(2, new TreeNode(4), new TreeNode(5)),
new TreeNode(3)
);
console.log(diameterOfBinaryTree(root)); // Output: 3
Line Notes
function height(node)Helper function to compute subtree height
if (!node) return 0;Base case for empty subtree
return 1 + Math.max(height(node.left), height(node.right));Height is 1 plus max height of children
const leftHeight = height(root.left);Compute left subtree height for diameter
const rightHeight = height(root.right);Compute right subtree height for diameter
const leftDiameter = diameterOfBinaryTree(root.left);Recursively compute left subtree diameter
const rightDiameter = diameterOfBinaryTree(root.right);Recursively compute right subtree diameter
return Math.max(leftHeight + rightHeight, Math.max(leftDiameter, rightDiameter));Return max diameter among three candidates
TimeO(n^2)
SpaceO(n) due to recursion stack
For each node, height is computed recursively which itself is O(n), leading to O(n^2) in total for n nodes.
💡 For n=20 nodes, this means roughly 400 operations, which grows quickly and becomes inefficient for large trees.
Interview Verdict: TLE / Use only to introduce
This approach is too slow for large inputs but is valuable to understand the problem and motivate optimization.