L2-051 满树的遍历

L2-051满树的遍历

解题思路

很简单的dfs函数,这里可以用set来存所有的度,度有三种情况:

  1. 度只有一个,就是0,当树只有一个结点的情况,这时候是合法的,为0阶满树。

  2. 度有2个,叶结点度为0,其余结点度相等,这种情况也是合法,*set.rbegin就是set最后一个元素,即最大度。

  3. 度大于等于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;
}
posted @ 2026-03-21 18:16  shuiwangrenjia  阅读(2)  评论(0)    收藏  举报