var diameterOfBinaryTree = function (root) {
if (!root) return 0
let treeDiameter = 0
// Returns height of the subtree rooted at node
function dfsHeight(node) {
// Base case: leaf node
if (!node.left && !node.right) return 0
let myDiameter = 0,
myHeight = 0,
leftH = 0,
rightH = 0
// Recursive case: internal node
if (node.left) {
leftH = dfsHeight(node.left)
myHeight = 1 + leftH
myDiameter = 1 + leftH
}
if (node.right) {
rightH = dfsHeight(node.right)
// Height will be whichever side's height is greater. We need to pass this up
myHeight = Math.max(1 + rightH, myHeight)
// diameter will be (1 + left height + 1 + right height)
myDiameter += 1 + rightH
}
// Update global treeDiameter if myDiameter is greater than the global
if (myDiameter > treeDiameter) treeDiameter = myDiameter
return myHeight
}
dfsHeight(root)
return treeDiameter
}