返回
与路飞一起征服 LeetCode 和剑指 Offer:探索二叉搜索树最近公共祖先
前端
2024-02-01 20:29:42
让我们扬帆起航,踏上算法探险之旅!
路飞,二叉搜索树中的探险家
在广阔的算法海洋中,二叉搜索树就像一座鬱鬱葱葱的岛屿,等待着我们去探索。它是一种特殊类型的二叉树,其中每个节点的值都比其左子树的所有值大,而比其右子树的所有值小。这意味着我们可以利用这种排序特性,高效地查找特定值或执行其他操作。
最近公共祖先:寻找家族的纽带
在二叉搜索树中,最近公共祖先(LCA)是指两个节点的最低共同祖先。例如,如果我们有一个节点 5,它的左子树包含节点 3 和 4,而右子树包含节点 7 和 8,那么 5 就是节点 3 和 7 的 LCA。
算法航海图:寻找 LCA 的技巧
探索二叉搜索树就像航行在大海中,我们需要一张航海图来指引方向。以下是寻找 LCA 的核心技巧:
- 比较当前节点的值: 首先,比较当前节点的值与两个目标节点的值。如果当前节点的值大于其中一个目标节点,则 LCA 肯定在左子树中;如果小于,则 LCA 肯定在右子树中。
- 递归深入: 根据第一步的结果,进入相应的子树进行递归。继续比较当前节点的值,直到找到 LCA。
- 特殊情况: 如果当前节点恰好是其中一个目标节点,则它就是 LCA。如果当前节点为 null,则不存在 LCA。
代码扬帆:用 Python 征服算法
理论只是航行的指南针,实践才是扬帆起航的动力。以下是用 Python 实现的 LCA 算法代码:
def find_LCA(root, n1, n2):
"""
查找二叉搜索树中两个节点的最近公共祖先。
Args:
root: 二叉搜索树的根节点。
n1: 目标节点 1。
n2: 目标节点 2。
Returns:
LCA 节点。
"""
if root is None:
return None
# 如果当前节点是 n1 或 n2,则它是 LCA。
if root.val == n1 or root.val == n2:
return root
# 比较当前节点的值与目标节点的值。
if root.val > n1 and root.val > n2:
# LCA 在左子树中。
return find_LCA(root.left, n1, n2)
elif root.val < n1 and root.val < n2:
# LCA 在右子树中。
return find_LCA(root.right, n1, n2)
else:
# 当前节点是 LCA。
return root
与路飞并肩作战:探索算法宝藏
借助清晰的算法技巧和 Python 代码的加持,我们已经掌握了寻找二叉搜索树最近公共祖先的秘诀。让我们与路飞一起扬帆起航,征服 LeetCode 和剑指 Offer 中更多的算法宝藏!
致谢
感谢“草帽小子”路飞,他的冒险精神激励着我们在算法的海洋中不断探索。感谢 AI 螺旋创作器的支持,让我们的航行更加顺畅。让我们继续扬帆远航,解锁更多编程的奥秘!