19.tarjan最近公共祖先

    int find(int i){
        return f[i]==i?i:f[i]=find(f[i]);
    }
    int Union(int nd1,int nd2){
        int a=find(nd1);
        int b=find(nd2);
        if(a==b) return 0;
        if(rank[a]<=rank[b]){
            f[a]=b;
            rank[b]+=rank[a];
        }
        else {
            f[b]=a;
            rank[a]+=rank[b];
        }
        return 1;
    }
    void LCA(int root){
        int i,sz;
        an[root]=root;//首先自成一个集合
        //sz=node[root].size();
        //for(i=0;i<sz;i++){
        if(lc[root]!=-1){
            LCA(lc[root]);//递归子树
            Union(root,lc[root]);//将子树和root并到一块 
            an[find(lc[root])]=root;
        }//修改子树的祖先也指向root
        if(rc[root]!=-1){
            LCA(rc[root]);//递归子树
            Union(root,rc[root]);//将子树和root并到一块 
            an[find(rc[root])]=root;//修改子树的祖先也指向root
        }
        vis[root]=1;
        sz=que[root].size();
        for(i=0;i<sz;i++){
            if(vis[que[root][i]]){
                printf("%d\n",ff=an[find(que[root][i])]);///root和que[root][i]所表示的值的最近公共祖先
                return ;
            }
        }
        return ;
    }
    int dfs(TreeNode* root){
        if(!root) return -1;;
        lc[root->val]=dfs(root->left);
        rc[root->val]=dfs(root->right);
        rank[root->val]=1;
        f[root->val]=root->val;
        return root->val;
    }

ps:最好用标号,不用root->val值

que[5].push_back(6)代表查询5-6的最近公共祖先

posted @ 2020-07-27 11:07  阿破  阅读(103)  评论(0编辑  收藏  举报