* struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    int f=0;
    vector<int>v;
    void dfs(TreeNode* root,int n){
        if(f||!root)
            return ;
        if(root->val==n)
            f=1;
        v.push_back(root->val);
        dfs(root->left,n);
        dfs(root->right,n);
        if(!f){
            v.pop_back();
            return ;
        }
        return ;
    }
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        // write code here
        vector<int>v1;
        vector<int>v2;
        dfs(root,o1);
        v1=v;
        v.clear();
        f=0;
        dfs(root,o2);
        v2=v;
    //    return v1[1];
        map<int,int>m;
        for(int i=0;i<v1.size();i++){
            m[v1[i]]=1;
        }
    //    return m[1];
        reverse(v2.begin(),v2.end());
        for(int i=0;i<v2.size();i++){
            if(m[v2[i]])
                return v2[i];
        }
        return root->val;
    }
};