URL: https://leetcode.com/problems/diameter-of-binary-tree/description/
Diameter: Longest path from any two nodes within a tree
Input: root=[1,null,2,3,4,5]
Output:3`

Intuition: Diameter = max(left subtree, right subtree) per node and DFS
findDiameter (node) {
if (root == null) return;
leftHeight = findLeftHeight(node->left)
rightHeight = findRightHeight(node->right)
currentDiameter = max(currentDiameter, leftHeight + rightHeight)
# DFS portion
findDiameter(node->left)
findDiameter(node->right)
}
Problem: Recalculating height multiple times
Objective: Reduce height calculation
int findDiameter(node, currentDiameter) {
if (node == null) return 0;
leftHeight = findDiameter(node->left, currentDiameter)
rightHeight = findDiameter(node->right, currentDiameter)
currentDiameter = max(currentDiameter, leftHeight + rightHeight)
return max(leftHeight, rightHeight) + 1
}
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int diameterOfBinaryTree(TreeNode* root) {
int res = 0;
dfs(root, res);
return res;
}
int dfs(TreeNode* root, int& res) {
if (!root) {
return 0;
}
int left = dfs(root->left, res);
int right = dfs(root->right, res);
res = max(res, left + right);
return 1 + max(left, right);
}
};