力扣HOT100 二叉树-236. 二叉树的最近公共祖先

祖先包括自己

cpp 复制代码
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == nullptr || root == p || root == q) {
            return root; // 找到 p 或 q 就不往下递归了,原因见上面答疑
        }
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        if (left && right) { // 左右都找到
            return root; // 当前节点是最近公共祖先
        }
        // 如果只有左子树找到,就返回左子树的返回值
        // 如果只有右子树找到,就返回右子树的返回值
        // 如果左右子树都没有找到,就返回 nullptr(注意此时 right = nullptr)
        return left ? left : right;
    }
};
复杂度分析
  • 时间复杂度:O(n),其中 n 为二叉树的节点个数。
  • 空间复杂度:O(n)。最坏情况下,二叉树是一条链,因此递归需要 O(n) 的栈空间。