题目描述
解法
这道题与二叉树的最近公共祖先最大的不同就是,二叉搜索树的性质:root的节点大于其左子树所有的节点,小于其右子树上所有的节点
这说明,我们可以通过判断root的值来判断p和q是否在该节点的左右子树上。
- 如果root大于p,小于q,那么root为最近的公共祖先
- 如果root等于p或q那么root为最大的公共祖先
- 迭代法
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
max_val = max(p.val,q.val)
min_val = min(p.val,q.val)
while root:
if root.val < min_val:
root = root.right
elif root.val > max_val:
root = root.left
else:
break
return root
时间复杂度是O(n),空间复杂度O(1),没有使用额外的空间。
- 递归法
思路和上面的迭代是一样的。
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
max_val = max(p.val,q.val)
min_val = min(p.val,q.val)
if root.val < min_val:
return self.lowestCommonAncestor(root.right)
elif root.val > max_val:
return self.lowestCommonAncestor(root = root.left)
return root
时间复杂度是O(n),空间复杂度O(1)
思考与感想
没有想法。。。。