对二叉树任意两个结点u和v,根是它们的公共祖先。除根之外,可能还有其它公共祖先,而在所有公共祖先中层数最大的结点叫做u和v的最近公共祖先,即LCA (Lowest Common Ancestor)。给出求u和v的最近公共祖先的算法。
时间: 2024-06-13 15:06:13 浏览: 184
以下是求二叉树任意两个结点u和v的最近公共祖先LCA的算法:
1. 从根节点开始遍历二叉树,如果当前节点为空或等于u或v,则返回当前节点。
2. 递归遍历当前节点的左子树,返回值记为left。
3. 递归遍历当前节点的右子树,返回值记为right。
4. 如果left和right都不为空,则说明当前节点的左右子树分别包含u和v,当前节点即为u和v的最近公共祖先。
5. 如果left为空,则说明u和v都在当前节点的右子树中,返回right。
6. 如果right为空,则说明u和v都在当前节点的左子树中,返回left。
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def lowestCommonAncestor(root, p, q):
if not root or root == p or root == q:
return root
left = lowestCommonAncestor(root.left, p, q)
right = lowestCommonAncestor(root.right, p, q)
if left and right:
return root
return left if left else right
```
阅读全文