Here is the solution:
diameter = 0
function height(node):
if node is null:
return 0
left = height(node.left)
right = height(node.right)
diameter = max(diameter, left + right)
return 1 + max(left, right)
function diameterOfBinaryTree(root):
height(root)
return diameter
Clean and simple. The diameter is tracked in a global variable.
This runs in time and uses space where is tree height.