Start learning free

LESSON 325 OF 410 · BINARY TREES

Binary Tree Diameter in Java (Time Complexity: O(n))

Practice O(n) Read the full explanation

Given the root of a binary tree, return the length of the diameter of the tree.

The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root.

The length of a path between two nodes is represented by the number of edges between them.

 

Example 1:

Input: root = [1,2,3,4,5]
Output: 3
Explanation: 3 is the length of the path [4,2,1,3] or [5,2,1,3].

Example 2:

Input: root = [1,2]
Output: 1

 

Constraints:

  • The number of nodes in the tree is in the range [1, 104].
  • -100 <= TreeNode.val <= 100
STEP 1 OF 10
    Ctrl + Enter to check

    JAVA · BINARY TREES

    Binary Tree Diameter in Java, explained

    Understanding the Problem

    The core challenge of this problem is to find the longest path between any two nodes in a binary tree. This path may or may not pass through the root. The significance of this problem lies in its applications in network design, biological tree structures, and more. A common pitfall is to assume the path must pass through the root, which is not necessarily true.

    Approach

    To solve this problem, we need to think about the properties of a binary tree and how to traverse it. A naive solution might involve checking all possible paths, but this would be highly inefficient. Instead, we can use a depth-first search (DFS) approach to calculate the height of each subtree and use this information to determine the diameter.

    Naive Solution

    The naive solution involves calculating the path length for every pair of nodes, which results in a time complexity of O(n^2). This is not optimal for large trees.

    Optimized Solution

    An optimized solution involves a single traversal of the tree using DFS. During the traversal, we calculate the height of each node's left and right subtrees. The diameter at any node is the sum of the heights of its left and right subtrees. We keep track of the maximum diameter found during the traversal.

    Algorithm

    1. Initialize a variable to keep track of the maximum diameter.

    2. Define a recursive function to calculate the height of a subtree.

    3. In the recursive function, calculate the height of the left and right subtrees.

    4. Update the maximum diameter if the sum of the heights of the left and right subtrees is greater than the current maximum diameter.

    5. Return the height of the subtree.

    Code Implementation

    
    // Definition for a binary tree node.
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }
    
    public class Solution {
        private int maxDiameter = 0;
    
        public int diameterOfBinaryTree(TreeNode root) {
            calculateHeight(root);
            return maxDiameter;
        }
    
        private int calculateHeight(TreeNode node) {
            if (node == null) {
                return 0;
            }
            // Recursively find the height of the left and right subtrees
            int leftHeight = calculateHeight(node.left);
            int rightHeight = calculateHeight(node.right);
    
            // Update the maximum diameter if the current diameter is larger
            maxDiameter = Math.max(maxDiameter, leftHeight + rightHeight);
    
            // Return the height of the current node
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }
    

    Complexity Analysis

    The time complexity of the optimized solution is O(n), where n is the number of nodes in the tree. This is because we visit each node exactly once. The space complexity is O(h), where h is the height of the tree, due to the recursion stack.

    Edge Cases

    1. Single node tree: The diameter is 0.

    2. Linear tree (all nodes have only one child): The diameter is the number of nodes minus one.

    3. Balanced tree: The diameter is the height of the tree.

    Testing

    To test the solution comprehensively, consider the following test cases:

    • Single node tree
    • Linear tree
    • Balanced tree
    • Randomly structured tree

    Use a variety of test cases to ensure the solution handles all edge cases effectively.

    Thinking and Problem-Solving Tips

    When approaching such problems, break down the problem into smaller subproblems. Use recursion to simplify the problem and think about how to use the properties of the data structure to your advantage. Practice similar problems to improve your problem-solving skills.

    Conclusion

    Understanding and solving the diameter of a binary tree problem is crucial for mastering tree-based algorithms. It helps in developing a deeper understanding of tree traversal techniques and their applications. Practice regularly to improve your skills and explore further.

    Additional Resources

    Keep going with JavaAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free