给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:
“对于有根树 T 的两个节点 p、q,
最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大
(一个节点也可以是它自己的祖先)。”
解题思路:
前提所有元素数值不重复
如果当前结点左右侧可以找到p q两个值,说明当前结点就是最近公共祖先
左右两侧不能同时找到,只能说明两者在一侧,且最小公共祖先在子结点及之后
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
# 异常处理
if not root:
return None
# 在同支子树中 先找到其中一个结点 那它就是最近祖先
if root.val == q.val or root.val == p.val:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
# 如果当前结点左右侧可以找到p q两个值,说明当前结点就是最近公共祖先
if left != None and right != None:
return root
# 左右两侧不能同时找到,只能说明两者在一侧,且最小公共祖先在子结点及之后
elif left == None:
return right
elif right == None:
return left
else:
pass