数据结构实验之查找三:树的种类统计
Time Limit: 400ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
随着卫星成像技术的应用,自然资源研究机构可以识别每一个棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。
输入
输入一组测试数据。数据的第1行给出一个正整数N (n <= 100000),N表示树的数量;随后N行,每行给出卫星观测到的一棵树的种类名称,树的名称是一个不超过20个字符的字符串,字符串由英文字母和空格组成,不区分大小写。
输出
按字典序输出各种树的种类名称和它占的百分比,中间以空格间隔,小数点后保留两位小数。
示例输入
2 This is an Appletree this is an appletree
示例输出
this is an appletree 100.00%
#include<bits/stdc++.h> using namespace std; struct node { char s[100]; int height; node *left; node *right; int num; }; int n; int height(node *root) { if(root==NULL)return 0; return root->height; } node* LL(node *root) { node* temp; temp=root->left; root->left=temp->right; temp->right=root; root->height=max(height(root->left),height(root->right))+1; temp->height=max(height(temp->left),height(temp->right))+1; return temp; } node* RR(node *root) { node*temp; temp=root->right; root->right=temp->left; temp->left=root; root->height=max(height(root->left),height(root->right))+1; temp->height=max(height(temp->left),height(temp->right))+1; return temp; } node* LR(node *root) { root->left=RR(root->left); return LL(root); } node* RL(node *root) { root->right=LL(root->right); return RR(root); } node* creat(node *root,char *str) { if(root==NULL) { root=new node; strcpy(root->s,str); root->left=root->right=NULL; root->height=1; root->num=1; } else if(strcmp(root->s,str)==0) root->num++; else if(strcmp(str,root->s)>0) { root->right=creat(root->right,str); if(height(root->right)-height(root->left)==2) { if(strcmp(str,root->right->s)>0)root=RR(root); else root=RL(root); } } else if(strcmp(str,root->s)<0) { root->left=creat(root->left,str); if(height(root->left)-height(root->right)==2) { if(strcmp(str,root->left->s)>0)root=LR(root); else root=LL(root); } } root->height=max(height(root->left),height(root->right))+1; return root; } void zhongxu(node *root) { if(root) { zhongxu(root->left); printf("%s %.2f%c\n",root->s,root->num*100.0/n,'%'); zhongxu(root->right); } } int main() { char str[100]; node *head=NULL; scanf("%d\n",&n); for(int i=0;i<n;i++) { gets(str); for(int j=0;str[j];j++) { if(str[j]>='A'&&str[j]<='Z') str[j]+=32; } head=creat(head,str); } zhongxu(head); }