返回

LeetCode 二叉搜索树系列:探索二叉搜索树的最近公共祖先

后端

  1. 何谓二叉搜索树的最近公共祖先(LCA)?

在二叉搜索树中,对于任意两个节点A和B,若存在一个节点P,使得A、B均是P的左子树或右子树,则称P为A和B的最近公共祖先(LCA)。举例来说,以下二叉搜索树中:

    10
   /  \
  5    15
 / \    /  \
3   7  12   20

10是5和15的LCA,5是3和7的LCA,15是12和20的LCA。

2. LCA算法原理及实现

2.1 递归算法

查找二叉搜索树的LCA可以采用递归算法。具体步骤如下:

  1. 若给定二叉搜索树为空,则没有LCA,返回空值。
  2. 若给定二叉搜索树仅有一个节点,则该节点即是LCA,返回该节点。
  3. 若给定二叉搜索树的根节点大于两个节点的值,则LCA必定在左子树中,递归地在左子树中查找LCA。
  4. 若给定二叉搜索树的根节点小于两个节点的值,则LCA必定在右子树中,递归地在右子树中查找LCA。
  5. 若给定二叉搜索树的根节点介于两个节点的值之间,则根节点即是LCA,返回根节点。

以以下二叉搜索树为例:

    10
   /  \
  5    15
 / \    /  \
3   7  12   20

查找节点5和15的LCA。首先,将根节点10与5和15比较,发现10大于5和15,因此LCA一定在左子树中。继续将左子树的根节点5与5和15比较,发现5等于5,因此5即为5和15的LCA。

2.2 非递归算法

查找二叉搜索树的LCA也可以采用非递归算法。具体步骤如下:

  1. 设置两个指针,指向给定的两个节点。
  2. 若两个指针指向同一个节点,则该节点即是LCA,返回该节点。
  3. 若两个指针指向不同节点,则将两个指针同时向上移动一层,即移动到它们的父节点。
  4. 重复步骤2和步骤3,直到两个指针指向同一个节点,该节点即是LCA,返回该节点。

继续以以下二叉搜索树为例:

    10
   /  \
  5    15
 / \    /  \
3   7  12   20

查找节点5和15的LCA。首先,将两个指针指向节点5和15。由于两个指针指向不同节点,将两个指针同时向上移动一层,指向它们的父节点10。由于两个指针现在指向同一个节点,因此10即为5和15的LCA。

3. 时间复杂度分析

递归算法和非递归算法的时间复杂度均为O(h),其中h为二叉搜索树的高度。这是因为在最坏的情况下,需要从根节点遍历到最深的叶子节点才能找到LCA。

4. 结语

通过本文,我们深入探讨了二叉搜索树的最近公共祖先(LCA)问题。我们不仅学习了LCA的定义和算法原理,还掌握了递归和非递归算法的实现方式。更重要的是,我们学会了分析算法的时间复杂度,以便评估算法的效率。希望您能学有所获,并在未来的算法学习和实践中游刃有余。