1004. Counting Leaves (30)
题目要求输出每层非父母的结点个数
思路:
1.建立一个数组来保存题目给出的父母结点,为提升查找效率,使用索引数组,大小为100,只有父母结点的值是“有效”的。
2.再建立一个数组统计每层的非父母结点数。
3.使用基于dfs的前序遍历,遍历到叶子结点统计个数。
需知:
只拿了27分,第三个测试点不过
#include <iostream>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int levelMax=0; //最后输出用
class node
{
public:
bool ispa;
int n;
vector<int> v;
node():ispa(false),v(100),n(0){}
};
void func(vector<node> &vno,vector<int> &vtr,int level,int i) //bfs遍历
{
if(!vno[i].ispa)
{
vtr[--level]++;
levelMax=levelMax>level?levelMax:level;
return;
}
level++;
for(int ii=0;ii<vno[i].n;ii++)
func(vno,vtr,level,vno[i].v[ii]); //vno[i].v[ii],当前结点的子节点
return;
}
int main()
{
int n,m;
cin>>n>>m;
vector<node> vno(100); //结点数组,vector_node
int i=0;
while(i<m)
{
int ii,jj;
cin>>ii;
cin>>vno[ii].n;
jj=0;
vno[ii].ispa=true;
while(jj<vno[ii].n)
cin>>vno[ii].v[jj++];
i++;
}
vector<int> vtr(100); //树的层次数组,vector_tree
func(vno,vtr,1,1);
i=0;
cout<<0;
while(i++<levelMax)
cout<<" "<<vtr[i];
system("pause");
return 0;
}
测试:
8 4
1 3 2 3 4
2 2 5 6
5 1 8
3 1 7