最近公共祖先
主要考验递归的掌握
例题

# 分类讨论
# 1.如果当前节点是p或q,则其为公共祖先,直接返回。当前节点为空为空返回None。
# 2.递归左右子树,如果p,q分别存在左右子树中,返回当前节点。
# 3.如果p,q 仅存在于左子树,向左递归。仅存在于右子树,向右递归。
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root is None or root is p or root is q:
return root
left=self.lowestCommonAncestor(root.left,p,q)
right=self.lowestCommonAncestor(root.right,p,q)
if left and right:
return root
if left:
return left
return right

# 可以用上面的普通解法,但是最好用上二叉搜索树的性质,主要判断当前节点的值与p和q的关系。
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if p.val>q.val:
temp=p
p=q
q=temp
if root is p or root is q:
return root
if p.val<root.val<q.val:
return root
return self.lowestCommonAncestor(root.left,p,q) if root.val>q.val else self.lowestCommonAncestor(root.right,p,q)
Comments NOTHING