class TreeNode { int val; TreeNode left, right; TreeNode(int val) { this.val = val; } } public class Solution { int maxDiameter = 0; public int diameterOfBinaryTree(TreeNode root) { depth(root); return maxDiameter; } private int depth(TreeNode node) { if (node == null) return 0; int left = depth(node.left); int right = depth(node.right); maxDiameter = Math.max(maxDiameter, left + right); return Math.max(left, right) + 1; } 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)); } }
The diameter is the longest path between any two nodes. Here, the longest path goes through nodes 4 -> 2 -> 1 -> 3, which has length 3 edges.
During recursion, 'maxDiameter' keeps track of the largest sum of left and right subtree depths found at any node, which corresponds to the longest path through that node.
class TreeNode { int val; TreeNode left, right; TreeNode(int val) { this.val = val; } } public class Solution { int maxDiameter = 0; public int diameterOfBinaryTree(TreeNode root) { depth(root); return maxDiameter; } private int depth(TreeNode node) { if (node == null) return 0; int left = depth(node.left); int right = depth(node.right); maxDiameter = Math.max(maxDiameter, left - right); return Math.max(left, right) + 1; } }
The code incorrectly uses subtraction (left - right) instead of addition (left + right) when updating maxDiameter, so the diameter value will be wrong.
class TreeNode { int val; TreeNode left, right; TreeNode(int val) { this.val = val; } } public class Solution { int maxDiameter = 0; public int diameterOfBinaryTree(TreeNode root) { depth(root); return maxDiameter; } private int depth(TreeNode node) { if (node == null) return 0; int left = depth(node.left); int right = depth(node.right); maxDiameter = Math.max(maxDiameter, left + right); return Math.max(left, right) + 1; } public static void main(String[] args) { TreeNode root = new TreeNode(1); root.right = new TreeNode(2); root.right.right = new TreeNode(3); root.right.right.right = new TreeNode(4); Solution sol = new Solution(); System.out.println(sol.diameterOfBinaryTree(root)); } }
The longest path is along the right side from node 1 to node 4, which has 3 edges, so diameter is 3.
Post-order traversal visits left and right children before the current node, allowing the algorithm to know subtree depths before updating the diameter at the current node.
