Link: https://leetcode.cn/problems/lowest-common-ancestor-of-deepest-leaves/

Question

difficulty: mid
adj diff: 3

Given the root of a binary tree, return the lowest common ancestor of its deepest leaves.

Recall that:

    The node of a binary tree is a leaf if and only if it has no children
    The depth of the root of the tree is 0. if the depth of a node is d, the depth of each of its children is d + 1.
    The lowest common ancestor of a set S of nodes, is the node A with the largest depth such that every node in S is in the subtree with root A.

Example 1:

Input: root = [3,5,1,6,2,0,8,null,null,7,4]
Output: [2,7,4]
Explanation: We return the node with value 2, colored in yellow in the diagram.
The nodes coloured in blue are the deepest leaf-nodes of the tree.
Note that nodes 6, 0, and 8 are also leaf nodes, but the depth of them is 2, but the depth of nodes 7 and 4 is 3.

Example 2:

Input: root = [1]
Output: [1]
Explanation: The root is the deepest node in the tree, and it's the lca of itself.

Example 3:

Input: root = [0,1,3,null,2]
Output: [2]
Explanation: The deepest leaf node in the tree is 2, the lca of one node is itself.

Constraints:

    The number of nodes in the tree will be in the range [1, 1000].
    0 <= Node.val <= 1000
    The values of the nodes in the tree are unique.

Code

class Pair {
    int depth;
    TreeNode node;
}

public TreeNode lcaDeepestLeaves(TreeNode root) {
    Pair p = findDepth(root);
    return p.node;
}

private Pair findDepth(TreeNode node) {
    Pair ret =  new Pair();
    if (node == null) {
        ret.depth = 0;
        return ret;
    }
    Pair leftDepth = findDepth(node.left);
    Pair rightDepth = findDepth(node.right);
    if (leftDepth.depth < rightDepth.depth) {
        ret.depth = rightDepth.depth + 1;
        ret.node = rightDepth.node;
    } else if (leftDepth.depth > rightDepth.depth) {
        ret.depth = leftDepth.depth + 1;
        ret.node = leftDepth.node;
    } else {
        ret.depth = leftDepth.depth + 1;
        ret.node = node;
    }
    return ret;
}