1. Graph Valid Tree 的另一种做法。

判断 graph 是不是 tree

1.树中没有形成环 (nodes don’t have circle)

2.连通分量的个数为 1 (only 1 root node)

并查集代码如下:

public  boolean validTree(int n, int[][] edges) {
    //数组p用来存储每个节点的祖宗
    int[] p = new int[n];
    //初始化,每个节点的祖宗初始化为它自己
    for(int i =0; i < n; i++){
        p[i] = i;
    }
    //集合的合并操作
    for(int j = 0; j < edges.length;j++){
        //遍历的过程,如果发现有环,则直接退出
        if(find(edges[j][0],p) == find(edges[j][1],p)){
            return false;
        }else{
            //否则合并两个集合
            union(edges[j][0],edges[j][1],p);
        }
    }
    //用来存储连通分量的个数
    int c = 0;
    for(int i = 0; i < n; i++){
        //根节点(连通分量)的个数
        if(p[i] == i){
            c++;
        }
    }
    //判断是否只有一个根节点
    return c == 1;
}

//两个集合的合并操作
void union(int x,int y,int[] p){
    //如果两个节点的祖宗不相等,则将两个集合合并
    int fx = find(x,p), fy = find(y,p);
    if(fx != fy) p[fx] = fy;
}

//查找一个节点的祖宗节点
int find(int x,int[] p){
    //如果当前节点的祖宗为它自己本身,则为根节点,否则继续往上递归
    if(p[x] != x) p[x] = find(p[x],p);
    return p[x];
}