LC 236二叉树中等第 51 / 95 题

二叉树的最近公共祖先

Lowest Common Ancestor of a Binary Tree

递归后序遍历
本机进度仅保存在当前浏览器

题目描述

给定一个二叉树,找到该树中两个指定节点 p 和 q 的最近公共祖先(LCA)。祖先的定义为:如果节点 p 在节点 root 的子树中,或 p == root,那么 root 是 p 的祖先。

示例:树 [3, 5, 1, 6, 2, 0, 8, null, null, 7, 4],p = 5,q = 1,LCA 为 3。

解题思路

  1. 后序递归:对每个节点,先在左右子树中分别查找 p、q。
  2. 若左右子树各命中一个,当前节点即最近公共祖先(p、q 分居两侧,交汇点必是 LCA)。
  3. 若只有一侧命中,说明两个目标都在那一侧(或一个目标本身就是祖先),把命中结果向上传递。
  4. 递归基:节点为空返回 None,等于 p 或 q 返回自身。

参考实现

查看参考实现Python · 建议先自行作答
def lowestCommonAncestor(root, p, q):
    # 后序遍历:自底向上汇聚命中信息
    if not root or root is p or root is q:
        return root
    left = lowestCommonAncestor(root.left, p, q)
    right = lowestCommonAncestor(root.right, p, q)
    if left and right:
        return root
    return left if left else right

复杂度与归属

时间复杂度O(n)
空间复杂度O(h)
所属分类二叉树
题源LeetCode 236

关联教程

返回题图鉴