建立一棵树,然后遍历。如果有向下的子节点非空,就继续递归遍历,如果这非叶子结点结果又不满足云杉定义,那么就不是云杉,立即终止递归遍历。(注意因为树的特性和题目数据,我们可以放心用递归而不导致栈溢出)
#include <cstdio>
#include <vector>
using namespace std;
struct tree{
vector<int> next;
}tree[10005];
int flag=1;
void fi(int index){
int cnt=0;
vector<int>::iterator it;
if(flag){
for(it=tree[index].next.begin();it!=tree[index].next.end();it++){
if(tree[*it].next.empty())cnt++;
else fi(*it);
}
}
if(cnt<3)flag=0;
}
int main(){
int n,index;
scanf("%d",&n);
for(int i=2;i<=n;i++){
scanf("%d",&index);
tree[index].next.push_back(i);
}
fi(1);
if(flag)printf("Yes");else printf("No");
}