返回
LeetCode 68 I: 二叉搜索树的最近公共祖先
见解分享
2023-09-17 23:37:32
导读:
当我们面对二叉搜索树中两个特定节点的最近公共祖先时,我们如何快速有效地找到它?让我们深入了解 LeetCode 的第 68 号问题,这是一个必不可少的算法练习,将引导我们掌握二叉搜索树中最近公共祖先的秘密。
算法概要:
最近公共祖先 (LCA) 是一个具有以下属性的节点:
- 它同时是两个给定节点的祖先。
- 它是具有这两个节点的祖先的所有节点中最深的节点。
在二叉搜索树中,LCA 具有一个独特的特性:它位于两个节点之间的路径上,并且它的值比一个节点大,而比另一个节点小。
Python 实现:
def lowestCommonAncestor(root, p, q):
# 递归边界条件
if not root or root == p or root == q:
return root
# 根据节点值将树分为左右子树
if root.val > p.val and root.val > q.val:
return lowestCommonAncestor(root.left, p, q)
elif root.val < p.val and root.val < q.val:
return lowestCommonAncestor(root.right, p, q)
else:
return root
算法步骤:
- 检查边界条件: 如果根节点为空或等于给定的节点 p 或 q,则直接返回根节点。
- 根据节点值划分子树: 如果根节点值大于 p 和 q,则 LCA 肯定在左子树中。如果根节点值小于 p 和 q,则 LCA 肯定在右子树中。
- 递归搜索子树: 在确定的子树中继续递归搜索 LCA。
- 返回 LCA: 当递归搜索达到边界条件时,返回找到的节点,即 LCA。
示例:
考虑一个二叉搜索树,其中 p = 5、q = 15,如下所示:
10
/ \
5 15
使用上述算法,我们有:
- 根节点为 10,大于 p 和 q,因此 LCA 在左子树中。
- 左子树根节点为 5,小于 q,因此 LCA 在右子树中。
- 右子树根节点为 15,大于 p,因此 LCA 为根节点本身,即 15。
复杂度分析:
- 时间复杂度: O(log N),其中 N 是二叉搜索树中的节点数。
- 空间复杂度: O(log N),用于递归调用栈。
结论:
通过理解二叉搜索树的独特特性,我们能够有效地找到两个给定节点的最近公共祖先。LeetCode 68 I 问题不仅是一个算法练习,更是对树形结构和祖先关系深入理解的证明。下次遇到二叉搜索树中 LCA 问题时,请自信地应用此算法,找到解决方案!