返回
寻找公共祖先的路径类型:LeetCode 专题解析
前端
2023-10-12 01:07:36
前言
在 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 并识别其类型,从而有效地解决各种树形问题。