PAT甲级 1004 27/30

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







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值