用DFS
如果root->val等于o1或者o2,就返回o1或者o2
如果左右子树一个返回o1一个返回o2,那就返回当前节点的val,因为这就是要找的节点。
如果左右子树中有某一个返回了不是-1也不是o1o2,那就说明那底下有要找的节点,直接返回他返回的值。
如果都不是就返回-1。

class Solution {
public:

    int dfs(TreeNode* root, int o1, int o2)
    {
        int left = -1, right = -1;
        if(root->val == o1) return o1;
        if(root->val == o2) return o2;
        if(root->left)
            left = dfs(root->left, o1, o2);
        if(root->right)
            right = dfs(root->right, o1, o2);
        if(left == o1 && right == o2 || right == o1 && left == o2)
            return root->val;
        else if(left == o1 || right == o1)
            return o1;
        else if(left == o2 || right == o2)
            return o2;
        else
            return left != -1 ? left : right;
    }

    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        return dfs(root, o1, o2);
    }
};