①用邻接表来建树,同时记录每个点的入度。
②判断所有节点的入度,入度为0的点为根,如有多个入度为0的点则非法;除了根结点之外的点入度都为1,如若大于1也不合法。
③对树进行dfs判断是否有环。
class Solution {
public:
bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
vector<vector<int>> g(n);
vector<int> deg(n,0),vis(n,0);
for(int i=0;i<n;i++){
if(leftChild[i]!=-1) g[i].push_back(leftChild[i]),deg[leftChild[i]]++;
if(rightChild[i]!=-1) g[i].push_back(rightChild[i]),deg[rightChild[i]]++;
}
int root=-1,cnt=0;
for(int i=0;i<n;i++){
if(!deg[i]){
root=i;
cnt++;
}
else if(deg[i]>1) return 0;
}
if(cnt!=1) return 0;
queue<int> q;
q.push(root);
vis[root]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(auto v:g[u]){
if(vis[v]) return 0;
vis[v]=1;
q.push(v);
cnt++;
}
}
return cnt==n;
}
};
时间复杂度:O(n),n为结点个数
空间复杂度:O(n)