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;
}

以上~

    原文作者:二叉树
    原文地址: https://blog.csdn.net/sinat_34328764/article/details/80283133
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞