1. 程式人生 > >二叉排序樹的應用之——資料結構實驗之查詢三:樹的種類統計

二叉排序樹的應用之——資料結構實驗之查詢三:樹的種類統計

注意:中序遍歷二叉樹時,只能在樹不為空的時候才能進行遞迴呼叫!

 

資料結構實驗之查詢三:樹的種類統計

Time Limit: 400 ms Memory Limit: 65536 KiB

Submit Statistic

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

 

#include<bits/stdc++.h>
using namespace std;

struct node
{
    char name[21];
    int dp;
    struct node *lchild, *rchild;
}*head;

struct node *buildtree(struct node *head, char w[])
{
    if(!head)
    {
        head = new struct node;
        head-> dp = 1;
        strcpy(head-> name, w);
        head-> lchild  = head-> rchild = NULL;
    }

    else
    {
        if(strcmp(head-> name, w) > 0)
        {
            head-> lchild = buildtree(head-> lchild, w);
        }

        else if(strcmp(head-> name, w) < 0)
        {
            head-> rchild = buildtree(head-> rchild, w);
        }

        else
        {
            head-> dp++;
        }
    }

    return head;
}

void inorder(struct node *head, int n)
{
    if(head)
    {
        inorder(head-> lchild, n);
        printf("%s %.2lf%%\n", head-> name, (100 * (double) head-> dp) / n);
        inorder(head-> rchild, n);
    }

}

int main(void)
{
    int n, i, j, m;
    char w[21];
    scanf("%d", &n);
    getchar();
    head = NULL;
    for(j = 0; j < n; j++)
    {
        gets(w);
        m = strlen(w);
        for(i = 0; i < m; i++)
        {
            if(w[i] >= 'A' && w[i] <= 'Z')
            {
                w[i] += 32;
            }
        }
        head = buildtree(head, w);
    }
    inorder(head, n);
    return 0;
}