隨着衛星成像技術的應用,自然資源研究機構可以識別每一棵樹的種類。請編寫程序幫助研究人員統計每種樹的數量,計算每種樹佔總數的百分比。首先輸入正整數N(≤105),隨後N行,每行給出衛星觀測到的一棵樹的種類名稱。種類名稱由不超過30個英文字母和空格組成(不區分大小寫)。按字典序遞增輸出各種樹的種類名稱及其所佔總數的百分比,其間以空格分隔,每種樹的信息佔一行。
- #include <cstdio>
- #include <sstream>
- #include <cstring>
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
- #include <sstream>
- using namespace std;
- #define N 35
- int n ;
- typedef struct node{
- char s[N] ;
- int cnt ;
- struct node *left , *right ;
- node(char _s[] = "" , int _cnt = 0)// 這個是 c++中的構造函數在new一個節點的時候給他裏面的成員變量就行賦值。
- {
- strcpy(s,_s);
- cnt = _cnt;
- left = NULL ;
- right = NULL ;
- }
- }Bnode ;
- void inOrder(Bnode* root)
- {
- if(root != NULL )
- {
- inOrder(root->left) ;
- printf("%s %.4lf%%\n" ,root->s , root->cnt * 100.0 / n ) ;
- inOrder(root->right) ;
- }
- }
- Bnode* createTree(Bnode* root , char s[])
- {
- if(root == NULL)
- root = new node(s,1); // 創建一個的節點並初始化
- else{
- int cmp = strcmp(s , root->s);
- if(cmp < 0)
- {
- root->left = createTree(root->left , s) ; // 相當於一個二叉樹的遍歷吧,
- }else if(cmp > 0){
- root->right = createTree(root->right , s) ;
- }else{
- root->cnt = root->cnt + 1 ; // 相同的就直接那個節點就裏的一個int 類型的計數器加1.
- }
- }
- return root ; 每次返回一個root節點
- }
- int main()
- {
- //freopen("in.txt", "r", stdin);
- scanf("%d\n",&n);
- int i ;
- char s[N] ;
- Bnode* root = NULL ;
- for(i = 0 ;i < n; i++)
- {
- gets(s) ;
- root = createTree(root , s); // 這個是根節點,每次都是相同的一個。在create函數中一步一步的遞歸後他他不變,只不過子樹變化了。
- }
- inOrder(root);
- return 0 ;
- }
- 運行截圖 略