返回

与路飞一起征服 LeetCode 和剑指 Offer:探索二叉搜索树最近公共祖先

前端

让我们扬帆起航,踏上算法探险之旅!

路飞,二叉搜索树中的探险家

在广阔的算法海洋中,二叉搜索树就像一座鬱鬱葱葱的岛屿,等待着我们去探索。它是一种特殊类型的二叉树,其中每个节点的值都比其左子树的所有值大,而比其右子树的所有值小。这意味着我们可以利用这种排序特性,高效地查找特定值或执行其他操作。

最近公共祖先:寻找家族的纽带

在二叉搜索树中,最近公共祖先(LCA)是指两个节点的最低共同祖先。例如,如果我们有一个节点 5,它的左子树包含节点 3 和 4,而右子树包含节点 7 和 8,那么 5 就是节点 3 和 7 的 LCA。

算法航海图:寻找 LCA 的技巧

探索二叉搜索树就像航行在大海中,我们需要一张航海图来指引方向。以下是寻找 LCA 的核心技巧:

  1. 比较当前节点的值: 首先,比较当前节点的值与两个目标节点的值。如果当前节点的值大于其中一个目标节点,则 LCA 肯定在左子树中;如果小于,则 LCA 肯定在右子树中。
  2. 递归深入: 根据第一步的结果,进入相应的子树进行递归。继续比较当前节点的值,直到找到 LCA。
  3. 特殊情况: 如果当前节点恰好是其中一个目标节点,则它就是 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 螺旋创作器的支持,让我们的航行更加顺畅。让我们继续扬帆远航,解锁更多编程的奥秘!