其实这题无需建树,所谓的建树无非是将数组保存的树变成结构体指向的树 多此一举 直接用这棵直白给你树搜就好了。这个代码只是练练怎么建树
题目就是说给你一颗多叉树求各层叶子结点的数目,思路就是搜索dfs、bfs都可以 然后搜的过程记录每个结点的深度,是叶子结点就让ans数组加1 然后叶子结点的判定就是子结点指针vector数组为空,这题我是dfs的过程中顺带把顺序树建成了标准的链式树。。
#include<iostream>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
#include<vector>
using namespace std;
struct Node{
int num;//id
int c;//当前结点的层次
vector<Node*> child;//这是颗不确定的多叉树 因此用vector结点指针类型存孩子结点
Node(int num_,int c_){
num=num_;
c=c_;
}
};
int n,m,cur,k,ans[105]={},max_=-1;//ans用来存取各层叶子结点的数目
vector<int> v[105];//输入的信息
void create(Node *cur){
Node *tmp;
int num=cur->num;
if(v[num].size()==0){//叶子结点
ans[cur->c]++;
max_=max(max_,cur->c);//保存最大层次以便后续输出
}
for(int i=0;i<v[num].size();i++){//深度优先建树
tmp=new Node(v[num][i],cur->c+1);
create(tmp);
cur->child.push_back(tmp);
}
}
int main()
{
Node *rt=new Node(1,0);//根节点的构造
cin>>n>>m;
int tmp;
for(int i=0;i<m;i++){
scanf("%d%d",&cur,&k);
for(int j=0;j<k;j++){
scanf("%d",&tmp);
v[cur].push_back(tmp);
}
}
create(rt);
for(int i=0;i<=max_;i++){
cout<<ans[i];
if(i==max_)
cout<<endl;
else
cout<<" ";
}
}