SDUT 树的种类统计(二叉排序树应用)

题目描述

数据结构实验之查找三:树的种类统计
Time Limit: 400 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
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%

分析 & 代码

对于这种类似的统计数量并且排序的题目,可以考虑使用二叉排序树解答,例如在这个题中,每次输入数名,就是向数中插入的过程,如果查找到相同的名称则对应的节点记录加一,否则就新建节点储存,这样最后进行中序遍历的结果就是最后的排序结果了。

还找到了一个测试数据,可以参考一下,不过题目要求的精准度不太一样:题目数据

#include<stdio.h>
#include<stdlib.h>
#include<iomanip>
#include<iostream>
using namespace std;
int n;
string temp;
string t[100005];
struct node{
    string name;
    int num;
    struct node * left;
    struct node * right;
};
typedef node *tree;
int ins(tree &t, string tempname){
    if(t==NULL){
        t=new node;
        t->name = tempname;
        t->num = 1;
        t->left = NULL;
        t->right = NULL;
    }
    else{
        if(t->name == tempname)
            t->num++;
        else if(t->name > tempname){
            ins(t->left, tempname);
        }
        else{
            ins(t->right, tempname);
        }
    }
}
int inorder(tree t){
    if(t){
        inorder(t->left);
        cout<<t->name<<" "<<fixed<<setprecision(2)<<t->num/(n*1.0)*100<<"%"<<endl;    //指定位数小数的输出方式  头文件为 iomanip
        inorder(t->right);
    }
}
int main(){
    cin>>n;
    tree t=NULL;
    getchar();
    for(int i=0; i<n; i++){
       getline(cin, temp);
        for(int i=0; i<temp.length(); i++){
            if(temp[i]>='A' && temp[i]<='Z')
                temp[i] = temp[i] + ('a' - 'A');           //将每个字符串先处理为统一的的小写
        }
        ins(t, temp);
    }
    inorder(t);
    return 0;
}

以上~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值