1115. Counting Nodes in a BST 解析

来源:互联网 发布:java鱼雷2017 编辑:程序博客网 时间:2024/05/21 18:48

按要求建立BST树

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

#include <iostream>#include <algorithm>#include <climits>#include <cstring>#include <stack>#include <queue>#include <map>#include <set>#include <string>#define MAX 10010using 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;elsereturn 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;}


原创粉丝点击