首先写个结构体来存节点
然后就直接遍历就行了,看看是不是每个节点都是size出现次数一样
再次遍历输出就行了
其实第二个遍历没必要,直接在第一个遍历里面存储值就行了
想必聪明的你肯定已经发现了
但是我一开始就直接想着两次,所以这里代码就不改了
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
#define sz(x) (int)x.size()
//2025.3.21
struct o{
vi a;
int size=0;
};
int n;
int mm=0;
int cnt=0;
map<int,int>vis;
vector<o>tree(100100);
void dfs(int head){//这一边就递归寻找,看看是不是每个节点的size即度为之前相等的数字,然后记录下来出现几个size
int t=tree[head].size;
if(t==0)return ;//到叶子节点了
if(vis[t]==0){cnt++;mm=max(mm,t);vis[t]=1;}
for(int i=0;i<t;i++){
dfs(tree[head].a[i]);
}
}
vi ans;
void dfss(int head){//这一次递归直接输出就行了
int t=tree[head].size;
ans.push_back(head);
for(int i=0;i<t;i++){
dfss(tree[head].a[i]);
}
}
void solve(){
int head;
cin>>n;int x;
for(int i=1;i<=n;i++){
cin>>x;
tree[x].a.push_back(i);
tree[x].size++;
if(x==0)head=i;
}
dfs(head);
cout<<mm<<" ";
if(cnt>1)cout<<"no";
else cout<<"yes";
cout<<endl;
dfss(head);
for(int i=0;i<n;i++){
cout<<ans[i];
if(i!=n-1)cout<<" ";
}
}
signed main()
{
solve();
return 0;
}