问题描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先
。
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
_______3______
/ \
___5__ ___1__
/ \ / \
6 _2 0 8
/ \
7 4
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
说明:
- 所有节点的值都是
唯一
的。 p、q
为不同节点且均存
在于给定的二叉树中。
问题分析:
(1)如果p、q
两个节点在同一分支上,很显然只要返回最上面那个即可。
(2)如果p、q
两个节点不在同一分支上,很显然,返回父节点即可。
(3)使用递归方法,如果当前节点与p、q
两个节点有一个相同就返回,其一。
(4)左右深度递归二叉树。
(5)最后判断左右两个分支返回值,如果都不为None
,说明当前节点,就是最近父节点,如果有一个为None
说明,现在还不确定,那么就继续返回那个不为None
的节点。如果都为None
,说明这个分支上没找到。
Python3实现:
class Solution:
def lowestCommonAncestor(self, root, p, q):
if root in (None, p, q): # 判断是否找到
return root
left = self.lowestCommonAncestor(root.left, p, q) # 左右深度递归
right = self.lowestCommonAncestor(root.right, p, q)
if left and right: # 两个节点都找到
return root
else:
return left or right # 找到其中一个
return None # 都没找到(加不加都行,加上严谨点)
声明: 总结学习,有问题可以批评指正,大神可以略过哦。