2023.6.16
记住只要遇到root.val在p与q之间,这个root就一定是最近公共祖先
自写版,递归的思路是
遇到空节点返还
遇到公共祖先节点返还
其他情况跟下一题有点类似
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
# 使用前序遍历,中左右
self.p = min(p.val, q.val)
self.q = max(p.val, q.val)
return self.getit(root)
def getit(self, root):
if root == None:
return None
if self.p <= root.val <=self.q:
return root
getleft = self.getit(root.left)
getright = self.getit(root.right)
if getleft == None and getright != None:
return getright
if getleft != None and getright == None:
return getleft
if getleft == None and getright == None:
return None
随想录:
好tmd精简,因为这里每次递归只选择向左或向右,所以直接一条路走到最近公共祖先。
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
# 使用前序遍历,中左右
self.p = p.val
self.q = q.val
return self.getit(root)
def getit(self, root):
# if root == None:
# return None
if self.p < root.val and self.q < root.val:
# 向左遍历
# getleft = self.getit(root.left)
# if getleft:
# return getleft
return self.getit(root.left)
if self.p > root.val and self.q > root.val:
# getright = self.getleft(root.right)
# if getright:
# return getright
return self.getit(root.right)
return root