思路:通过递归的思路写这道题就非常容易,想象一下某一个状态,p,q 分别在root的两边,那代表什么?是不是代表,p,q是在root点分开的。那我们就找到了这个点。那再想象一下,如果p,q都在同一边,那我们就去找边找,比如,p,q都在左子树,那么我们就把根节点左子树传下去,右边同理。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
"""
:type root: TreeNode
:type p: TreeNode
:type q: TreeNode
:rtype: TreeNode
"""
if root is None or root == p or root == q:
return root
left = self.lowestCommonAncestor(root.left, p , q)
right = self.lowestCommonAncestor(root.right, p, q)
# if left is None:
# return right
# elif right is None:
# return left
# else:
# return root
#下面一行写法,展开在上面?
return right if left is None else left if right is None else root
同样的思路也可以写235题,只不过不是二叉树,是二叉搜索树。可以根据二叉搜索树的性质。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
"""
:type root: TreeNode
:type p: TreeNode
:type q: TreeNode
:rtype: TreeNode
"""
# if p.val< root.val >q.val:
# return self.lowestCommonAncestor(root.left, p, q)
# if p.val> root.val <q.val:
# return self.lowestCommonAncestor(root.right, p, q)
#return root
#一行写法,拓展如上
return self.lowestCommonAncestor(root.left, p, q) if p.val< root.val >q.val else self.lowestCommonAncestor(root.right, p, q) if p.val> root.val <q.val else root
#非递归写法
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
"""
:type root: TreeNode
:type p: TreeNode
:type q: TreeNode
:rtype: TreeNode
"""
while root:
if p.val <root.val >q.val:
root = root.left
elif p.val> root.val < p.val:
root = root.right
else:
return root