🧩Algo 二叉树

236. 二叉树的最近公共祖先

难度:🟡 Medium | 标签:树、DFS | 状态:⬜ LeetCode 链接

思路

后序递归:

  • 当前是 p 或 q → 返回当前
  • 左右子树各自的递归结果都非空 → 当前是 LCA
  • 一边非空一边空 → 返回非空那边

代码

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (!root || root == p || root == q) return root;
        auto* l = lowestCommonAncestor(root->left, p, q);
        auto* r = lowestCommonAncestor(root->right, p, q);
        if (l && r) return root;
        return l ? l : r;
    }
};

复杂度

  • 时间 O(n),空间 O(h)

易错 / 回顾

  • p / q 一定在树里(题目保证),所以非空那边一定包含对应节点
  • BST 版本(235)可以利用大小关系,O(h)
  • 多次查询:用 Tarjan 离线或 LCA 倍增预处理
Related · 二叉树