返回
LeetCode 二叉搜索树系列:探索二叉搜索树的最近公共祖先
后端
2024-02-19 04:36:47
- 何谓二叉搜索树的最近公共祖先(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可以采用递归算法。具体步骤如下:
- 若给定二叉搜索树为空,则没有LCA,返回空值。
- 若给定二叉搜索树仅有一个节点,则该节点即是LCA,返回该节点。
- 若给定二叉搜索树的根节点大于两个节点的值,则LCA必定在左子树中,递归地在左子树中查找LCA。
- 若给定二叉搜索树的根节点小于两个节点的值,则LCA必定在右子树中,递归地在右子树中查找LCA。
- 若给定二叉搜索树的根节点介于两个节点的值之间,则根节点即是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也可以采用非递归算法。具体步骤如下:
- 设置两个指针,指向给定的两个节点。
- 若两个指针指向同一个节点,则该节点即是LCA,返回该节点。
- 若两个指针指向不同节点,则将两个指针同时向上移动一层,即移动到它们的父节点。
- 重复步骤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的定义和算法原理,还掌握了递归和非递归算法的实现方式。更重要的是,我们学会了分析算法的时间复杂度,以便评估算法的效率。希望您能学有所获,并在未来的算法学习和实践中游刃有余。