Skip to content

M1123.最深叶节点的最近公共祖先

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

思路:如果直接想还挺难,但是如果考虑到二叉树的通用递归思路,那么就可以有很好的解决方法,即利用递归的思路

如果左子树更深,最深叶节点在左子树中,我们返回 {左子树深度 + 1,左子树的 lca 节点} 如果右子树更深,最深叶节点在右子树中,我们返回 {右子树深度 + 1,右子树的 lca 节点} 如果左右子树一样深,左右子树都有最深叶节点,我们返回

cpp
class Solution {
public:
    pair<TreeNode*, int> f(TreeNode* root) {
        if (!root) {
            return {root, 0};
        }

        auto left = f(root->left);
        auto right = f(root->right);

        if (left.second > right.second) {
            return {left.first, left.second + 1};
        }
        if (left.second < right.second) {
            return {right.first, right.second + 1};
        }
        return {root, left.second + 1};

    }

    TreeNode* lcaDeepestLeaves(TreeNode* root) {
        return f(root).first;
    }
};