2021-12-09 每日打卡:腾讯精选50题
写在前面
“这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情、专注,决定了在做某件事时能走多远,能做多好。” 该系列文章由python编写,遵循LeetBook 列表/腾讯的刷题顺序,所有代码已通过。每日3道,随缘剖析,希望风雨无阻,作为勉励自己坚持刷题的记录。
235. 二叉搜索树的最近公共祖先
- 递归:
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return None
# 三者总会满足一个,对于二叉树而言只需要检查左右两边即可
if root.val > p.val and root.val > q.val:
return self.lowestCommonAncestor(root.left, p, q)
if root.val < p.val and root.val < q.val:
return self.lowestCommonAncestor(root.right, p, q)
return root
- 非递归:
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return None
node = root
while node:
if node.val < p.val and node.val < q.val:
node = node.right
elif node.val > p.val and node.val > q.val:
node = node.left
else:
return node
return None
236. 二叉树的最近公共祖先
- 递归(有点激动3分钟0错误写出一道中等题,好像在算法考试的时候对递归动归和贪心突然开窍了2333):
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return None
if root == p or root==q: return root
r,l = None,None
if root.right:
r = self.lowestCommonAncestor(root.right,p,q)
if root.left:
l = self.lowestCommonAncestor(root.left,p,q)
if r and l:
return root
return r if r else l
- 还可以存储父节点的方式,这里只放个思路: