基于公共祖先特点的递归做法
从根节点往下递归:
1. 若该节点是第一个值为o1或o2的节点,则该节点是最近公共祖先;
2. 否则,看左子树是否包含o1或o2:
    2.1 若左子树包含o1或o2,则看右子树有没有:
        a. 若右子树没有,则公共祖先在左子树
        b. 若右子树有,则o1和o2肯定是左右子树一边一个,则公共祖先是根节点;
    2.2 若左子树不包含o1和o2,则公共祖先在右子树或者该根子树不包含o1和o2。(两种情况都取决于右子树)
class Solution:
    def lowestCommonAncestor(self , root: TreeNode, o1: int, o2: int) -> int:
        # write code here
        return self.DFS(root, o1, o2).val
    # 该子树是否包含o1或o2
    def DFS(self, root,o1, o2):
        if root is None:
            return None
        if root.val == o1&nbs***bsp;root.val == o2:
            return root
        left = self.DFS(root.left, o1, o2)
        if left == None:
            return self.DFS(root.right, o1, o2)
        # 左子树有,则看右子树有没有
        # 若右子树没有,则右子树返回 None
        right = self.DFS(root.right, o1, o2)
        if right == None:
            return left
        # 左子树右子树都有,则最近的祖先节点是root
        return root