并查集
如果父节点和子节点已经有共同的祖先,说明会形成环,返回false;
若是子节点已经有父节点了,那直接返回false;
最后判断一下连通分支是不是为1,看看是不是只有一颗树。
class Solution {
public:
vector<int> p;
int N;
int f(int i)
{
while(i!=p[i])
{
p[i]=p[p[i]];
i=p[i];
}
return i;
}
bool unio(int a,int b)
{
if(b==-1)return true;
int x=f(a);
int y=f(b);
if(x==y)return false;
if(y==b)
{p[b]=a;
N--;
}
else return false;
return true;
}
bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
p.resize(n,0);
N=n;
for(int i=0;i<n;i++)
p[i]=i;
int i=0;
while(i<n)
{
if(!unio(i,leftChild[i])) return false;
if(!unio(i,rightChild[i])) return false;
i++;
}
if(N!=1)return false;
return true;
}
};