# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None
classSolution: deflowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': # 分类讨论一下:找p和q的最近公共祖先,包括p和q自身,所以如果找到p或者q就直接返回对应节点 # 如果另一个节点在找到的那个下面,那正好一起了;如果在另一边,就会在上面产生一个节点左右都有值 # 那这个都有值的节点就是答案,返回即可。 # 那么对于普通节点,如果左边有值,就得检查右边有没有值,没有的话,只返回左边; # 左边没值的话,无论右边是否空都返回右边,毕竟一样 # 时间:On,最坏情况下还得遍历整个树 # 空间:On,最坏情况下递归嵌套n个 ifnot root or root is p or root is q: return root # 同时解决边缘为空,以及正好找到pq两点的情况 l = self.lowestCommonAncestor(root.left, p, q) r = self.lowestCommonAncestor(root.right, p, q) ifnot l: return r return root if l and r else l # 这里复合了右边没有的情况和两边都有的情况
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None
classSolution: deflowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': # 时间:On,最坏情况下还得遍历整个树 # 空间:On,最坏情况下递归嵌套n个 # 与普通二叉树的最近公共祖先相比,这里可以利用二叉搜索树的性质更快地找到这个祖先 # 对于一个节点,如果p和q分别在两侧,那么当前节点一定是最近公共祖先,因为当前节点的左右子树各涵盖不了另一个。 # 如果pq同侧,那就只遍历那一边即可,而且找到其中一个就能立刻返回,因为这种遍历说明都是一侧的,另一个一定在下面 if root is p or root is q: # p 和 q 必然存在的情况下,这个遍历方式不可能遇到空 return root x = root.val if p.val < x and q.val < x: returnself.lowestCommonAncestor(root.left, p, q) if p.val > x and q.val > x: returnself.lowestCommonAncestor(root.right, p, q)