数据结构实验之查找三:树的种类统计
题目描述
随着卫星成像技术的应用,自然资源研究机构可以识别每一个棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。
输入
输入一组测试数据。数据的第1行给出一个正整数N (n <= 100000),N表示树的数量;随后N行,每行给出卫星观测到的一棵树的种类名称,树的名称是一个不超过20个字符的字符串,字符串由英文字母和空格组成,不区分大小写。
输出
按字典序输出各种树的种类名称和它占的百分比,中间以空格间隔,小数点后保留两位小数。
示例输入
2 This is an Appletree this is an appletree
示例输出
this is an appletree 100.00%
/*基础的二叉排序树,建树之后中序遍历输出就可以*/#include <algorithm> #include <iostream> #include <numeric> #include <cstring> #include <iomanip> #include <string> #include <vector> #include <cstdio> #include <queue> #include <stack> #include <cmath> #include <map> #include <set> #define LL long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int M = 1010; const double esp = 1e-6; const int INF = 0x3f3f3f3f; const double PI = 3.141592653589793; using namespace std; struct node{ char data[30]; int num; node *l,*r; }*root; char str[30]; void *build(node * &p){ if(p == NULL){ p = new node; p->l = NULL; p->r = NULL; p->num = 1; strcpy(p->data,str); } else{ if(strcmp(str,p->data) == 0){ p->num++; } else if(strcmp(str,p->data) < 0){ build(p->l); } else build(p->r); } } void mid(node *p,int n){ if(p!=NULL){ mid(p->l,n); printf("%s %.2lf%\n",p->data,(double)p->num*100/n); mid(p->r,n); } } int main(){ int n; scanf("%d\n",&n); root = NULL; for(int i=0;i<n;i++){ gets(str); for(int j=0;str[j]!='\0';j++){ if(str[j] >='A' && str[j] <= 'Z') str[j]+=32; } build(root); } mid(root,n); return 0; }