给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点p、q
,最近公共祖先表示为一个结点 x
,满足x
是 p、q
的祖先且 x
的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树:
root = [3,5,1,6,2,0,8,null,null,7,4]
示例:
输入:
root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释: 节点5
和节点1
的最近公共祖先是节点3
。
说明:
- 所有节点的值都是唯一的。
-
p、q
为不同节点且均存在于给定的二叉树中。
来源:剑指Offer第68-II题
相关企业:
公司 | 出现时间 |
---|---|
美团外卖 | 2020.03 |
字节跳动 | 2020.03 |
解法:递归查找
时间复杂度:O(n)
空间复杂度:O(n)
思路:由于lowestCommonAncestor(root, p, q)
的功能是找出以root
为根节点的两个节点p
和q
的最近公共祖先。 我们考虑:
- 如果
p
和q
分别是root
的左右节点,那么root
就是我们要找的最近公共祖先 - 如果
root
是None
,说明我们在这条寻址线路没有找到,我们返回None
表示没找到 - 我们继续在左右子树执行相同的逻辑。
- 如果左子树没找到,说明在右子树,我们返回
lowestCommonAncestor(root.right, p , q)
- 如果右子树没找到,说明在左子树,我们返回
lowestCommonAncestor(root.left, p , q)
- 如果左子树和右子树分别找到一个,我们返回
root
代码:
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
l = self.lowestCommonAncestor(root.left, p , q)
r = self.lowestCommonAncestor(root.right, p , q)
return root if l and r else l or r