1115. Counting Nodes in a BST 解析

按要求建立BST树

然后层序遍历,统计每层的个数和最大层数,按要求输出最后两行个数就好。

#include <iostream>
#include <algorithm>
#include <climits>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <string>

#define MAX 10010

using namespace std;

int n;
struct node{
	vector <int> next;
	double m_estate;
	double area;
	node() {m_estate = 0 ; area = 0;};
};
node m[MAX];
bool isVis[MAX];

struct Ans{
	int c;
	double avg_sets;
	double avg_area;
	int id;
};
vector <Ans> ans;
Ans NowAns;


void LevelOrder(int st){
	NowAns.id = st;
	NowAns.avg_area = m[st].area;
	NowAns.avg_sets = m[st].m_estate;
	NowAns.c = 1;
	isVis[st] = false;
	queue <int> q;
	q.push(st);
	while(!q.empty()){
		int top = q.front();
		q.pop();
		for(int i = 0; i < m[top].next.size();i++){
			int v = m[top].next[i];
			if(isVis[v]){
				isVis[v] = false;
				q.push(v);
				if(v <NowAns.id)
					NowAns.id = v;
				NowAns.avg_area += m[v].area;
				NowAns.avg_sets += m[v].m_estate;
				NowAns.c ++;
			}
		}
	}
	NowAns.avg_area /= double(NowAns.c);
	NowAns.avg_sets /= double(NowAns.c);
	ans.push_back(NowAns);
}

bool cmp(Ans a1, Ans a2){
	if(a1.avg_area != a2.avg_area)
		return a1.avg_area > a2.avg_area;
	else
		return a1.id < a2.id;
}

int main(){

	scanf("%d",&n);

	memset(isVis,false,sizeof(isVis));

	for(int i  =0 ; i < n ;i++){
		int id,fa,ma,k;
		scanf("%d%d%d%d",&id,&fa,&ma,&k);
		isVis[id] = true;
		if(fa != -1){
			m[id].next.push_back(fa);
			m[fa].next.push_back(id);
			isVis[fa] = true;
		}
		if(ma != -1){
			m[id].next.push_back(ma);
			m[ma].next.push_back(id);
			isVis[ma] = true;
		}
		int cid;
		for(int j = 0 ; j < k ;j++){
			scanf("%d",&cid);
			isVis[cid] = true;
			m[id].next.push_back(cid);
			m[cid].next.push_back(id);
		}
		scanf("%lf%lf",&m[id].m_estate,&m[id].area);
	}

	for(int i = 0; i < MAX ;i++){
		if(isVis[i]){
			LevelOrder(i);
		}
	}

	sort(ans.begin(),ans.end(),cmp);

	printf("%d\n",ans.size());
	for(int i = 0 ; i< ans.size() ;i++)
		printf("%04d %d %.03lf %.03lf\n",ans[i].id,ans[i].c,ans[i].avg_sets,ans[i].avg_area);


	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值