class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
                            //本题解法好像不满足时间复杂度On,已经要达到1秒了
    int num=0;              //用于控制存入双亲表示法的结构体的变量

    typedef struct tree{
        int val;
        int parent;
    }tree;               //树的双亲表示法的结构体

    tree a[100000];     //结构体声明

    void jianli(TreeNode* root,int b){     //该方法将链式存储改为顺序双亲存储
        a[num].val=root->val;
        a[num].parent=b;
        b=num;
        num++;
        if(root->left!=NULL) jianli(root->left,b);
        if(root->right!=NULL) jianli(root->right,b);
    }

    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        // write code here
        for(int i=0;i<100000;i++) a[i].val=-1,a[i].parent=-2;  //初始化
        jianli(root,-1);      //建立
        int j,k;
        for(int i=0;i<100000;i++){      //找到目的节点的位置
            if(a[i].val==o1) j=i;
            if(a[i].val==o2) k=i;
        }
        int e[100000],g=0,h=0;
        while(j!=-1){            //将其中一个节点的所有双亲列出
            e[g]=a[j].val;
            j=a[j].parent;
            g++;
        }
        while(k!=-1){           //另一个节点的每个双亲跟前一个结点的双亲去匹配,第一个相同的就是结果
            for(int i=0;i<100000;i++){
                if(a[k].val==e[i]){
                    h=e[i];
                    break;
                }
            }
            k=a[k].parent;
            if(h!=0) break;
        }
        return h;
    }
};