7-12 树种统计(25 point(s))(BST)

来源:互联网 发布:阿里云空间购买流程 编辑:程序博客网 时间:2024/04/29 19:56

7-12 树种统计(25 point(s))

随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。

输入格式:

输入首先给出正整数N(105),随后N行,每行给出卫星观测到的一棵树的种类名称。种类名称由不超过30个英文字母和空格组成(大小写不区分)。

输出格式:

按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位。

输入样例:

29Red AlderAshAspenBasswoodAshBeechYellow BirchAshCherryCottonwoodAshCypressRed ElmGumHackberryWhite OakHickoryPecanHard MapleWhite OakSoft MapleRed OakRed OakWhite OakPoplanSassafrasSycamoreBlack WalnutWillow

输出样例:

Ash 13.7931%Aspen 3.4483%Basswood 3.4483%Beech 3.4483%Black Walnut 3.4483%Cherry 3.4483%Cottonwood 3.4483%Cypress 3.4483%Gum 3.4483%Hackberry 3.4483%Hard Maple 3.4483%Hickory 3.4483%Pecan 3.4483%Poplan 3.4483%Red Alder 3.4483%Red Elm 3.4483%Red Oak 6.8966%Sassafras 3.4483%Soft Maple 3.4483%Sycamore 3.4483%White Oak 10.3448%Willow 3.4483%Yellow Birch 3.4483%写一个二叉搜索树就可以了,然后中序遍历输出code: 
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>int n;char name[100010][35];struct TNode{//写一个二叉搜索树储存字符串    int time;//记录相同字符串出现的次数    char *name;//记录字符串    struct TNode* Left;    struct TNode* Right;//左右指针};typedef struct TNode* Tree;Tree Insert(Tree BST, char s[]){//插入    Tree q;    if(BST==NULL){//如果为空,新建节点        q = (Tree)malloc(sizeof(struct TNode));        q->time = 1;//初始化        q->name = s;        q->Left = NULL;        q->Right = NULL;        return q;//返回    }    if(strcmp(BST->name,s)<0){//如果要插入的字符串大于当前字符串。插入到右子树        BST->Right = Insert(BST->Right,s);    }    else if(strcmp(BST->name,s)>0){//如果小,插入左子树        BST->Left = Insert(BST->Left,s);    }    else{        BST->time++;//如果相等,当前节点次数++    }    return BST;//返回树的指针}void inorder(Tree BST){//中序遍历输出字符串同时计算出所占的百分比即可    if(BST!=NULL){        inorder(BST->Left);        printf("%s %.4f%%\n",BST->name,(double)BST->time*1.0/(double)n*100);        inorder(BST->Right);    }}int main(){    int i;    scanf("%d",&n);    Tree BST = NULL;    getchar();    for(i = 0; i < n; i++){        gets(name[i]);        BST = Insert(BST,name[i]);    }    inorder(BST);    return 0;}