返回

寻找公共祖先的路径类型:LeetCode 专题解析

前端

前言

在 LeetCode 上,涉及公共祖先 (LCA) 的问题普遍且具有挑战性。LCA 是两个节点在树中最近的公共祖先节点,它对于解决诸如求解树中两节点的距离和查找子树中所有节点的 LCA 等问题至关重要。

判定路径存在性

第一步是判定两个节点之间是否存在路径。对于二叉搜索树来说,可以使用 BST 特性:如果两个节点都在当前节点的左子树中,则它们的 LCA 也在左子树中;如果都在右子树中,则 LCA 在右子树中;否则,当前节点就是 LCA。对于二叉树,可以使用 DFS 或 BFS 遍历树,标记两个节点的路径,然后检查是否存在公共节点。

确定 LCA 类型

确定 LCA 类型涉及以下情况:

  • LCA 类型 1: 两个节点在同一子树中,LCA 是该子树的根节点。
  • LCA 类型 2: 两个节点分别在不同的子树中,LCA 是当前节点。
  • LCA 类型 3: 两个节点是同一父节点的子节点,LCA 是父节点。

算法步骤

对于二叉搜索树:

def LCA_BST(root, p, q):
    if not root:
        return None
    if p.val < root.val and q.val < root.val:
        return LCA_BST(root.left, p, q)
    if p.val > root.val and q.val > root.val:
        return LCA_BST(root.right, p, q)
    return root

对于二叉树:

def LCA_Tree(root, p, q):
    if not root:
        return None
    if root.val == p.val or root.val == q.val:
        return root
    left_LCA = LCA_Tree(root.left, p, q)
    right_LCA = LCA_Tree(root.right, p, q)
    if left_LCA and right_LCA:
        return root
    return left_LCA if left_LCA else right_LCA

示例

二叉搜索树:

         10
        /  \
       5    15
      / \    / \
     2   7  12  20
  • 查找 5 和 15 的 LCA,类型为 1,LCA 为 10。
  • 查找 2 和 12 的 LCA,类型为 2,LCA 为 10。
  • 查找 2 和 20 的 LCA,类型为 3,LCA 为 15。

二叉树:

         1
        / \
       2   3
      / \
     4   5
  • 查找 4 和 5 的 LCA,类型为 1,LCA 为 2。
  • 查找 2 和 3 的 LCA,类型为 2,LCA 为 1。
  • 查找 4 和 3 的 LCA,类型为 3,LCA 为 1。

总结

理解二叉搜索树和二叉树中公共祖先的路径类型对于解决 LeetCode 相关问题至关重要。通过使用上述算法和示例,您可以准确确定 LCA 并识别其类型,从而有效地解决各种树形问题。