问题
这道题去年刷过,但是今年来做又没写对,写篇文章从头到尾梳理下思路,强化下记忆。(愿佛祖保佑信女,面试遇到此题时可以信手拈来。。。。
说明:
- 所有节点的值都是唯一的。
- p、q 为不同节点且均存在于给定的二叉树中。
分析
最近公共祖先(Lowest Common Ancestor: LCA)的位置有两种情况:
- LCA就存在于p、q之中;
- LCA不存在于p、q之中
给了root, p,q,首先badcase判断一下root 是不是等于p或者q,如果是的话,不用再找了,LCA必定就是root了,对应上图的场景二。
如果不等于就麻烦点了。因为题目说了嘛,所有的元素不会重复,那我们取左子树和右子树分别去找找p和q,这个时候又分三种场景:
- p, q都在左子树中;
- p, q都在右子树中;
- p, q一个在左子树中,一个在右子树中:那就是对应上图的场景一了。
Python实现
def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
if not root or root.val == p.val or root.val == q.val:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left and right:
return root
else:
if left:
return left
if right:
return right