L2-051 满树的遍历
解题思路
很简单的dfs函数,这里可以用set来存所有的度,度有三种情况:
-
度只有一个,就是0,当树只有一个结点的情况,这时候是合法的,为0阶满树。
-
度有2个,叶结点度为0,其余结点度相等,这种情况也是合法,*set.rbegin就是set最后一个元素,即最大度。
-
度大于等于3个,这种情况是不合法的。
还要回忆一下的是,当我们遍历一棵树的时候,什么时候把数放进一个数组,最后出来的是前序遍历。当我们进入任何一颗子树之前,只要刚遇到这个结点,就放进数组,也就是在递归之前放进数组,而这个位置又不能放在遍历邻接表的for循环里面,所以位置就固定了
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
vector<int> parent[100010];
set<int> cnt;
vector<int> ans;
void dfs(int u)
{
int count = 0 ;
ans.push_back(u);
for(int v : parent[u])
{
count ++;
dfs(v);
}
cnt.insert(count);
}
int main()
{
int n;cin>>n;
int root = 0;
for(int i = 1; i <= n ; i++)
{
int fa;
cin>>fa;
if(fa == 0) root = i ;
parent[fa].push_back(i);
}
dfs(root);
if(cnt.size() == 1) cout<<"0 yes"<<endl;
else if(cnt.size() == 2) cout<<*cnt.rbegin()<<" yes"<<endl;
else cout<<*cnt.rbegin()<<" no"<<endl;
for(int i = 0 ; i < ans.size() ; i ++)
{
cout<<ans[i];
if(i != ans.size()-1) cout<<" ";
}
return 0;
}

浙公网安备 33010602011771号