PTA1004. Counting Leaves (30)(树的搜索,dfs/bfs)

其实这题无需建树,所谓的建树无非是将数组保存的树变成结构体指向的树 多此一举 直接用这棵直白给你树搜就好了。这个代码只是练练怎么建树
题目就是说给你一颗多叉树求各层叶子结点的数目,思路就是搜索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<<" ";
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值