已知二叉树中的两个结点,求距离它们最近的共同祖先代码
时间: 2024-12-12 22:30:26 浏览: 23
在二叉树中找到两个节点的最近公共祖先(Lowest Common Ancestor,LCA)通常涉及递归遍历。这个问题可以使用“路径压缩”或“层序遍历”的思路解决。以下是使用Python的一个简单递归解法:
首先,假设每个节点都有一个parent指针,表示其直接父节点,以及一个isVisited标志,用于记录我们是否已经访问过这个节点。我们可以从两个目标节点开始,如果他们的父节点相同,那么当前节点就是最近公共祖先;如果不相同,我们将继续查找他们各自父节点的最近公共祖先。
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None, parent=None):
self.val = val
self.left = left
self.right = right
self.parent = parent
self.isVisited = False
def find_lca(root, p, q):
if not root:
return None
root.isVisited = True
if root == p or root == q:
return root
left_lca = find_lca(root.left, p, q)
right_lca = find_lca(root.right, p, q)
# 如果其中一个孩子是LCA,则当前节点也是LCA
if left_lca and right_lca:
return root
# 否则,LCA位于未访问的子树中
return left_lca if left_lca else right_lca
```
这里的关键在于利用了二叉搜索树的特性,当我们在一条路径上找不到LCA,就尝试另一条路径,直到找到为止。
阅读全文