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;
    }
};

思路:dfs 返回左右子树的最大深度和 lca , 选取深度最大的子树及其 lca, 如果深度相等, 则说明当前节点是 lca

cpp
class Solution {
public:
    TreeNode* lcaDeepestLeaves(TreeNode* root) {
        return dfs(root).first;
    }

    pair<TreeNode*, int> dfs(TreeNode* root) {
        if (!root) return {nullptr, 0};

        auto [left_lca, left_depth] = dfs(root->left);
        auto [right_lca, right_depth] = dfs(root->right);
        if (left_depth < right_depth) {
            return {right_lca, right_depth + 1};
        } else if (left_depth > right_depth) {
            return {left_lca, left_depth + 1};
        } else {
            return {root, left_depth + 1};
        }
    }
};