原题链接:
DFS
class Solution {
public:
vector<vector<int>> adj;
vector<int> visit;
int num=0;
void dfs(int now)
{
visit[now]=1;
num++;
for(auto x:adj[now])
{
if(!visit[x]) dfs(x);
}
}
bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
vector<int> indegree(n);
adj.resize(n);
visit.resize(n);
for(int i=0;i<leftChild.size();i++)
{
if(leftChild[i]!=-1)
{
adj[i].push_back(leftChild[i]);
indegree[leftChild[i]]++;
}
}
for(int i=0;i<rightChild.size();i++)
{
if(rightChild[i]!=-1)
{
adj[i].push_back(rightChild[i]);
indegree[rightChild[i]]++;
}
}
int num0=0,root=-1;
for(int i=0;i<n;i++)
{
if(indegree[i]==0)
{
num0++;
root=i;
}
if(indegree[i]>1 || num0>1) return false;
}
if(num0==0) return false;
dfs(root);
return num==n;
}
};
BFS
class Solution {
public:
vector<vector<int>> adj;
vector<int> visit;
bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
vector<int> indegree(n);
adj.resize(n);
visit.resize(n);
for(int i=0;i<leftChild.size();i++)
{
if(leftChild[i]!=-1)
{
adj[i].push_back(leftChild[i]);
indegree[leftChild[i]]++;
}
}
for(int i=0;i<rightChild.size();i++)
{
if(rightChild[i]!=-1)
{
adj[i].push_back(rightChild[i]);
indegree[rightChild[i]]++;
}
}
int num0=0,root=-1;
for(int i=0;i<n;i++)
{
if(indegree[i]==0)
{
num0++;
root=i;
}
if(indegree[i]>1 || num0>1) return false;
}
if(num0==0) return false;
queue<int> q; q.push(root);
visit[root]=1;
int num=1;
while(!q.empty())
{
int now=q.front(); q.pop();
for(auto x:adj[now])
{
if(!visit[x])
{
num++;
visit[x]=1; q.push(x);
}
}
}
return num==n;
}
};
并查集
class Solution {
public:
map<int,int> father;
int findfather(int x)
{
int a=x;
while(x!=father[x]) x=father[x];
while(a!=father[a])
{
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
void Union(int a,int b)
{
int fa=findfather(a);
int fb=findfather(b);
if(fa!=fb) father[fb]=fa;
}
bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
vector<int> indegree(n);
for(int i=0;i<n;i++) father[i]=i;
for(int i=0;i<leftChild.size();i++)
{
if(leftChild[i]!=-1)
{
indegree[leftChild[i]]++;
Union(i,leftChild[i]);
}
}
for(int i=0;i<rightChild.size();i++)
{
if(rightChild[i]!=-1)
{
indegree[rightChild[i]]++;
Union(i,rightChild[i]);
}
}
int num0=0,root=-1;
for(int i=0;i<n;i++)
{
if(indegree[i]==0)
{
num0++;
root=i;
}
if(indegree[i]>1 || num0>1) return false;
findfather(i);
}
if(num0==0) return false;
for(int i=0;i<n;i++) if(father[i]!=root) return false;
return true;
}
};