二叉树的最低公共祖先

17 Mar 2025 | 4 分钟阅读

二叉树的最低公共祖先代表什么?

树中包含 n1 和 n2 均为其后代的最低节点是最低公共祖先(LCA),而 n1 和 n2 是我们正在寻找 LCA 的节点。因此,位于离根节点最远的 n1 和 n2 节点的公共祖先是包含 n1 和 n2 的二叉树的 LCA。

LCA(最低公共祖先)的应用

树中节点对之间的距离可以计算为根到 n1 的距离加上根到 n2 的距离减去根到其最低公共祖先距离的两倍。

示例

Lowest Common Ancestor of a Binary Tree

方法 -

  • 我们知道,因为这是一个二叉搜索树,左子节点将小于或等于根节点,而右子节点将大于根节点。本质上,这涉及到检查以下边缘情况
  • 如果根为空,则返回 null。
  • 如果其中一个节点是根节点(最低公共祖先),则 LCA 是根节点。
  • 如果一个节点大于根节点而另一个节点小于根节点,则根节点是 LCA。
  • 如果提供的两个节点相同,则不存在 LCA。返回 null。
  • 如果两个节点都小于根节点,则迭代调用 LCA 函数以在根节点的左子节点上计算步骤 1 到 4。
  • 如果两个节点都大于根节点,则迭代调用 LCA 函数以在根节点的右子节点上计算步骤 1 到 4。

C++ 程序

使用单次遍历的递归方法

时间复杂度

O(n)

空间复杂度

O(n)

打印 LCA 的函数

输入

输出

3

迭代方法

使用双次遍历并分别找到节点 p 和 q 的路径,然后比较它们的路径以找到 LCA。

复杂度

时间复杂度

O(n)+O(n)

空间复杂度

O(n)+O(n)

打印 LCA 的函数

输入

输出

3

用 Python 打印 LCA 的函数

输入

输出

3

用 Java 打印 LCA 的函数

输入

输出

3