L2-051 满树的遍历

首先写个结构体来存节点

然后就直接遍历就行了,看看是不是每个节点都是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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值