数据结构实验之查找三:树的种类统计
程序员文章站
2022-03-24 16:04:14
...
-
数据结构实验之查找三:树的种类统计
Time Limit: 400 ms Memory Limit: 65536 KiB
Problem Description
随着卫星成像技术的应用,自然资源研究机构可以识别每一个棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。
Input
输入一组测试数据。数据的第1行给出一个正整数N (n <= 100000),N表示树的数量;随后N行,每行给出卫星观测到的一棵树的种类名称,树的名称是一个不超过20个字符的字符串,字符串由英文字母和空格组成,不区分大小写。
Output
按字典序输出各种树的种类名称和它占的百分比,中间以空格间隔,小数点后保留两位小数。
Sample Input
2
This is an Appletree
this is an appletree
Sample Output
this is an appletree 100.00%
Hint
Source
xam
-
--加权二叉查找树的做法:
-
原理:由于按照字典序输出二叉树,因此这是一个基于字符串建立的树。
-
插入规则为,如果所插入的节点的字符串,在字符串比较函数strcmp()中与根值root->name比较,
-
较小的放到根的左孩子上,较大的放在右孩子上,,
-
如果与根值相同,则根值的权值++;
#include <stdio.h>
#include<string.h>
typedef struct st
{
struct st *l,*r;
char data[22];
int num;
} tree;
tree *creat(tree *root,char s[])
{
if(!root)//根节点为空
{
root=new tree;
//不存在根节点,注意需要申请根节点,否则会CE
strcpy(root->data,s);
//把值放在根节点
root->num=1;
root->l=root->r=NULL;
}
else
{
if(strcmp(root->data,s)==0)
{
root->num++;
}
else if(strcmp(root->data,s)>0)
{
root->l=creat(root->l,s);
}
else if(strcmp(root->data,s)<0)
{
root->r=creat(root->r,s);
}
}
return root;
}
void pre(tree *root,int n)//输出方式会 左孩子-根-右孩子 即中序遍历
{
if(root)
{
pre(root->l, n);
printf("%s %.2lf%%\n",root->data, 100*(double)root->num/n);
pre(root->r, n);
}
}
int main()
{
char s[25];
int n,i,j;
scanf("%d",&n);
getchar();
tree *root=NULL;
for(j=0; j<n; j++)
{
gets(s);
int m=strlen(s);
for(i=0; i<m; i++)
{
if(s[i]>='A'&&s[i]<='Z')
s[i]=s[i]-'A'+'a';
//把大写字母转化为小写
}
root=creat(root,s);
}
pre(root,n);
return 0;
}
上一篇: 数据结构学习笔记(一)
下一篇: live jquery 不支持吗