二叉搜索树中的最低公共祖先

17 Mar 2025 | 4 分钟阅读

二叉搜索树

二叉搜索树是一种二叉树,其中任何节点的所有小于它的值都存在于其左子树中,而所有大于它的值都存在于其右子树中。

问题陈述

我们给出了二叉搜索树的根节点以及两个整数值 n 和 m。我们的任务是返回二叉搜索树中这两个节点的最低公共祖先。

例如

Lowest Common Ancestor in a Binary Search Tree

在上例中,我们有一棵二叉搜索树,我们将找出一些节点的最低公共祖先。

  1. n=6,m=15,则最低公共祖先是 12
  2. n=4,m=22,则最低公共祖先是 12
  3. n=7,m=9,则最低公共祖先是 9

方法 1

我们将找出从根节点到节点 1 的路径和从根节点到节点 2 的路径,并将其存储在 ArrayList 中。现在,ArrayList 的第一个公共元素将是最低公共祖先。

Java 代码

输出

Lowest Common Ancestor in a Binary Search Tree

时间复杂度: O(H)+O(H),其中 H 是树的高度。在最坏的情况下,它可以高达 O(N)。

空间复杂度: 最坏情况下为 O(N)+O(N)。

方法 2

我们将使用递归来获得节点的最低公共祖先。

  • 在递归调用中,如果当前节点等于节点 1 或节点 2,则当前节点将是 LCS(最低公共祖先)。
  • 如果当前节点的值小于一个节点且大于另一个节点,则当前节点将是 LCS。
  • 如果当前节点的值小于两个节点的值,则答案将位于当前节点的右子树中。
  • 如果当前节点的值大于两个节点的值,则答案将位于当前节点的左子树中。

Java 代码

输出

Lowest Common Ancestor in a Binary Search Tree

时间复杂度:最坏情况下为 O(N);否则为 O(H),其中 H 是高度。

空间复杂度:O(H) 辅助递归栈空间。

方法 3

此方法是上述解决方案的迭代方法。它将帮助我们节省递归占用的辅助堆栈空间。

Java 代码

输出

Lowest Common Ancestor in a Binary Search Tree

时间复杂度: O(H),其中 H 是树的高度,在最坏的情况下可以是 N。

空间复杂度: O(1),因为不使用辅助空间。