class Solution {
public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) {
UnionFind uf = new UnionFind(n);
for(int i =0;i<n;i++){
int left = leftChild[i];
int right = rightChild[i];
if(left != -1)
{
if(uf.find(left)!=left)//如果左右孩子已有了父节点
return false;
boolean flag = uf.Union(i,left);
if(flag == false)
return false;
}
if(right != -1)
{
if(uf.find(right)!=right)//如果左右孩子已有了父节点
return false;
boolean flag = uf.Union(i,right);
if(flag == false)
return false;
}
}
return uf.count == 1;
}
public class UnionFind{
int[] parent;
int count;
public int getCount(){
return count;
}
public UnionFind(int n){
parent = new int[n];
count = n;
for(int i =0;i<n;i++){
parent[i] = i;
}
}
public int find(int x){
if(parent[x] != x)
parent[x] = find(parent[x]);
return parent[x];
}
public boolean Union(int x,int y){
int rootX = find(x);
int rootY = find(y);
if(rootX == rootY)
return false ;
parent[rootY] = rootX;
count -= 1;
return true;
}
}
}