Longest Univalue Path

medium tree dfs

Problem

Given the root of a binary tree, return the length (in edges) of the longest path where all nodes have the same value. The path does not need to pass through the root.

Inputroot = [5,4,5,1,1,null,5]
Output2
The longest 5-path is leftmost-5 → root-5 → right-5 (2 edges).

def longest_univalue_path(root):
    best = [0]
    def arm(n):
        if not n: return 0
        l = arm(n.left); r = arm(n.right)
        pl = l + 1 if n.left and n.left.val == n.val else 0
        pr = r + 1 if n.right and n.right.val == n.val else 0
        best[0] = max(best[0], pl + pr)
        return max(pl, pr)
    arm(root)
    return best[0]
function longestUnivaluePath(root) {
  let best = 0;
  (function arm(n) {
    if (!n) return 0;
    const l = arm(n.left), r = arm(n.right);
    const pl = n.left && n.left.val === n.val ? l + 1 : 0;
    const pr = n.right && n.right.val === n.val ? r + 1 : 0;
    best = Math.max(best, pl + pr);
    return Math.max(pl, pr);
  })(root);
  return best;
}
class Solution {
    int best = 0;
    public int longestUnivaluePath(TreeNode root) { arm(root); return best; }
    int arm(TreeNode n) {
        if (n == null) return 0;
        int l = arm(n.left), r = arm(n.right);
        int pl = (n.left != null && n.left.val == n.val) ? l + 1 : 0;
        int pr = (n.right != null && n.right.val == n.val) ? r + 1 : 0;
        best = Math.max(best, pl + pr);
        return Math.max(pl, pr);
    }
}
int best = 0;
int arm(TreeNode* n) {
    if (!n) return 0;
    int l = arm(n->left), r = arm(n->right);
    int pl = (n->left && n->left->val == n->val) ? l + 1 : 0;
    int pr = (n->right && n->right->val == n->val) ? r + 1 : 0;
    best = max(best, pl + pr);
    return max(pl, pr);
}
int longestUnivaluePath(TreeNode* root) { best = 0; arm(root); return best; }
Time: O(n) Space: O(h)